Loading... > https://leetcode.cn/problems/find-longest-special-substring-that-occurs-thrice-i/description/?envType=daily-question&envId=2024-05-02 字符串仅含有小写字母,且长度最大为 50 ,因此可以记录下每个字母在不同长度下出现的个数,然后统计即可。 ```c++ class Solution { public: int maximumLength(std::string s) { const int n = s.length(); int count = 1; std::vector<std::vector<int>> statistic(n + 1, std::vector<int>(26)); for (int i = 1; i < n; i++) { if (s[i] == s[i - 1]) { count++; } else { for (int j = 1; j <= count; j++) statistic[j][s[i - 1] - 'a'] += count - j + 1; count = 1; } } for (int j = 1; j <= count; j++) statistic[j][s[n - 1] - 'a'] += count - j + 1; int res = -1; for (int i = n; i > 0; i--) { for (int j = 0; j < 26; j++) { if (statistic[i][j] >= 3) return i; } } return res; } }; ``` - 时间复杂度:$O(n)$ ,其中 $n$ 为字符串的长度。 - 空间复杂度:$O(C \times n)$ ,其中 $C$ 为字符集的大小,本题中固定为 26 。 ### 优化 因为题目要求至少出现三次,所以可以仅维护每个字符的前三长的长度,这样空间复杂度就可以降低到 $O(C)$ 。 > 不想写了复制个题解吧 ```c++ class Solution { public: int maximumLength(string s) { int ans = -1; int len = s.size(); vector<int> chs[26]; int cnt = 0; for (int i = 0; i < len; i++) { cnt++; if (i + 1 == len || s[i] != s[i + 1]) { int ch = s[i] - 'a'; chs[ch].push_back(cnt); cnt = 0; for (int j = chs[ch].size() - 1; j > 0; j--) { if (chs[ch][j] > chs[ch][j - 1]) { swap(chs[ch][j], chs[ch][j - 1]); } else { break; } } if (chs[ch].size() > 3) { chs[ch].pop_back(); } } } for (int i = 0; i < 26; i++) { if (chs[i].size() > 0 && chs[i][0] > 2) { ans = max(ans, chs[i][0] - 2); } if (chs[i].size() > 1 && chs[i][0] > 1) { ans = max(ans, min(chs[i][0] - 1, chs[i][1])); } if (chs[i].size() > 2) { ans = max(ans, chs[i][2]); } } return ans; } }; ``` 最后修改:2024 年 05 月 29 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏