leetcode
题目编号:395
代码解析:
class Solution {
public:
int longestSubstring(string s, int k) {
int n = s.size();
if (k > n) {
return 0;
}
if (k == 1) {
return n;
}
return longestSubstring(s, 0, n -1 , k);
}
int longestSubstring(string &s, int start, int end, int k)
{
if (start >= end || end - start + 1 < k) {
return 0;
}
vector<int> alpha(26, 0);
// 注意区间
for (int i = start; i <= end; i++) {
++alpha[s[i] - 'a'];
}
bool flag{false};
for (auto & i : alpha) {
if (i > 0 && i < k) {
flag = true; // 存在不满足要求的元素
break;
}
}
if (!flag) {
return end - start + 1;
}
int ret{0};
int left{0}, right{0};
while(right <= end) {
while (left <= end) {
if (alpha[s[left] - 'a'] >= k) {
break; // 当前left符合要求,跳出,不递加left
}
++left; // 当前left不符合要求,右移
}
right = left + 1; // 当前s[left]是符合要求的,所以依次右移判断。
while (right <= end) {
if (alpha[s[right] - 'a'] > 0 && alpha[s[right] - 'a'] < k) {
break; // 当前right不符合要求,退出
}
++right;
}
if (right - left > ret) {
ret = max(ret , longestSubstring(s, left, right -1, k));
}
left = right + 1;
}
return ret;
}
};