双指针
LeetCode 424 Longest Repeating Character Replacement
思路
暴力解法
- 遍历字符串的所有子串,对每个子串检查是否满足条件:找到该子串出现次数最多的字符,剩下字符的数量小于k,如果满足记录子串长度。O^3
- 找到满足条件子串中最长的。
双指针
原因
- 子串[i, j]的左i不变,满足条件的j最大的时候 => 不需要去遍历更大的j了(剪枝?),此时可以去变化i了、
- 那如果对每个i,都找到一个满足条件的最大j,记录此时的[i, j]
- 复杂度O^2
- 更高效的:当找到一个i定点,j最大的时候,将i,j各加一(滑动窗口),即向右移动一格,之后如果j能更大则j++(滑动窗口变大),直至滑到最后。O(n)
代码
int f(string s, int k) {
vector<int> num(26, 0);
int left = 0;
int right = 0;
int maxCharacterNum = 0;
while (right < s.length()) {
num[s[right] - 'A']++;
maxCharacterNum = max(maxCharacterNum, num[s[right] - 'A']);
if (right - left + 1 - maxCharacterNum > k) {
num[s[left++] - 'A']--;
}
right++;
}
return right - left;
}
posted on 2021-02-02 22:30 路过的小游侠_Eyes 阅读(15) 评论(0) 收藏 举报
浙公网安备 33010602011771号