如果一个字符串满足以下条件,则称其为 美丽字符串 :
·
它由英语小写字母表的前 k
个字母组成。
·
它不包含任何长度为 2
或更长的回文子字符串。
给你一个长度为 n
的美丽字符串 s
和一个正整数 k
。
请你找出并返回一个长度为 n
的美丽字符串,该字符串还满足:在字典序大于 s
的所有美丽字符串中字典序最小。如果不存在这样的字符串,则返回一个空字符串。
对于长度相同的两个字符串 a
和 b
,如果字符串 a
在与字符串 b
不同的第一个位置上的字符字典序更大,则字符串 a
的字典序大于字符串 b
。
·
例如,"abcd"
的字典序比 "abcc"
更大,因为在不同的第一个位置(第四个字符)上 d
的字典序大于 c
。
示例 1:
输入:s = "abcz", k = 26
输出:"abda"
解释:字符串 "abda" 既是美丽字符串,又满足字典序大于 "abcz" 。
可以证明不存在字符串同时满足字典序大于 "abcz"、美丽字符串、字典序小于 "abda" 这三个条件。
示例 2:
输入:s = "dc", k = 4
输出:""
解释:可以证明,不存在既是美丽字符串,又字典序大于 "dc" 的字符串。
提示:
·1 <= n == s.length <= 105
·4 <= k <= 26
·s
是一个美丽字符串
题目大意:返回大于s的最小美丽字符串。
分析:设M为s中的字符最大不能超过的字符,则M='a'+k-1。
(1)由于返回的字符串需比s大,因此将s的最后一个字符加1;
(2)设字符串长度为N,在(1)操作后,最后一个字符的值改变,可能会破坏美丽字符串的结构。当s[N-1]==s[N-2]或s[N-1]==s[N-3]时,s不是美丽字符串,为了比原来的字符串大且保持美丽字符串,需将s[N-1]加1,直至s[N-1]==M+1或者(s[N-1]!=s[N-2]且s[N-1]!=s[N-3]);
(3)对(2)中的两种情况进一步讨论。当s[N-1]!=s[N-2]且s[N-1]!=s[N-3]时,s为大于原字符串的最小美丽字符串,符合题意,终止字符加1的操作;当s[N-1]==M+1时,由于最大的字符为M,因此需将s[N-1]置为'a',将s[N-2]加1,而s[N-2]改变,可能会破坏前面的美丽字符串的结构,因此将s[N-2]加1,直至s[N-2]==M+1或者(s[N-2]!=s[N-3]且s[N-2]!=s[N-4]),对于这两种情况用相同的方式进行处理即可;
(4)假设(3)中操作在字符s[i]上终止,则s[0:i]符合美丽字符串,而子串s[i+1,N-1]全由字符'a'组成。因此当i!=N-1时,需进一步对s[i+1]到s[N-1]中每个字符进行填充,每个填入的字符为不与前面两个字符相同的最小字符,使字符串在符合美丽字符串的情况下最小。
class Solution {
public:string smallestBeautifulString(string s, int k) {int N=s.size(),i=N-1;k+='a';++s[N-1];while(i<N){if(s[i]==k){if(!i) return "";s[i]='a';++s[--i];}else if(i>0&&s[i]==s[i-1]||i>1&&s[i]==s[i-2]) ++s[i];else ++i;}return s;}
};