题目链接:https://leetcode.cn/problems/longest-substring-of-all-vowels-in-order/
题目大意:给出一串只含有元音字母aeiou
的字符串word[]
,求满足以下条件的子串的最长长度。
a<e<i<o<u
,小的元音字母必须都在大的元音字母前面- 必须含有所有五个元音字母
思路:先把字符串换成数组,用01234
代表aeiou
,方便比大小。用last
记录上一个数字,当前扫描的数字为arr[i]
,合法的情况只有arr[i] == last
或者arr[i] == last+1
。否则,就得重新开始找合法的子串。
在更新max_len
的时候,只有所有元音字母都包含才行(checkALL()
)。重新找合法子串时,记得将记录是否包含的标记(known[]
)。但这里有一个小插曲,我起初是使用.resize(5, false)
来清空的,后来发现这样子不会达到预想的效果,很多标记还没有被置为false
,于是重新写了个函数来完清空。
for (int i = 0; i < arr.size(); i++) {
if (arr[i] == last + 1) {
known[arr[i]] = true;
tmp_len++;
if (checkAll())
max_len = max(max_len, tmp_len);
}
else if (arr[i] == last){
tmp_len++;
if (checkAll())
max_len = max(max_len, tmp_len);
}
else {
tmp_len = 1;
doClear();
known[arr[i]] = true;
}
last = arr[i];
}
完整代码
class Solution {
public:
vector<bool> known;
vector<int> arr;
bool checkAll() {
for (int i = 0; i < known.size(); i++) {
if (!known[i])
return false;
}
return true;
}
void doClear() {
for (int i = 0; i < known.size(); i++)
known[i] = false;
}
int longestBeautifulSubstring(string word) {
arr.clear();
for (int i = 0; i < word.length(); i++) {
char c = word[i];
switch(word[i]) {
case 'a': arr.push_back(0);break;
case 'e': arr.push_back(1);break;
case 'i': arr.push_back(2);break;
case 'o': arr.push_back(3);break;
default: arr.push_back(4);
}
}
known.resize(5, false);
int last = -1;
int max_len = 0, tmp_len = 0;
for (int i = 0; i < arr.size(); i++) {
if (arr[i] == last + 1) {
known[arr[i]] = true;
tmp_len++;
if (checkAll())
max_len = max(max_len, tmp_len);
}
else if (arr[i] == last){
tmp_len++;
if (checkAll())
max_len = max(max_len, tmp_len);
}
else {
tmp_len = 1;
doClear();
known[arr[i]] = true;
}
last = arr[i];
}
if (max_len < 5)
max_len = 0;
return max_len;
}
};