题目链接:https://leetcode.cn/problems/longest-substring-of-all-vowels-in-order/
题目大意:给出一串只含有元音字母aeiou
的字符串word[]
,求满足以下条件的子串的最长长度。
a,小的元音字母必须都在大的元音字母前面
思路:先把字符串换成数组,用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 known;vector 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; }
};
上一篇:基于jsp+ssm+springboot的餐厅点餐系统【毕业论文+源码】
下一篇:Windows安装Stable Diffusion ComfyUI及问题解决记录(注意不是Stable Diffusion WebUI)