题目地址:
https://leetcode.com/problems/maximize-the-confusion-of-an-exam/
给定一个只含T, F
的字符串
s
s
s,再给定一个正整数
k
k
k,允许将
s
s
s中的最多某
k
k
k个相同字符变为另一个字符(只能变为T, F
),问得到的字符串的最长连续相同字母构成的子串有多长。
思路是双指针,假设是将某些T
变为F
,枚举右端点,用一个变量维护区间内的T
的数量,如果数量大于
k
k
k则收缩左端点,接着更新答案。代码如下:
public class Solution {
public int maxConsecutiveAnswers(String s, int k) {
return Math.max(calc(s, k, 'T'), calc(s, k, 'F'));
}
int calc(String s, int k, char ch) {
int res = 0, cnt = 0;
for (int i = 0, j = 0; i < s.length(); i++) {
cnt += s.charAt(i) == ch ? 1 : 0;
while (cnt > k) {
cnt -= s.charAt(j) == ch ? 1 : 0;
j++;
}
res = Math.max(res, i - j + 1);
}
return res;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。