一【题目类别】
- 哈希表
二【题目难度】
- 中等
三【题目编号】
- 424.替换后的最长重复字符
四【题目描述】
- 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。
- 在执行上述操作后,返回包含相同字母的最长子字符串的长度。
五【题目示例】
-
示例 1:
- 输入:s = “ABAB”, k = 2
- 输出:4
- 解释:用两个’A’替换为两个’B’,反之亦然。
-
示例 2:
- 输入:s = “AABABBA”, k = 1
- 输出:4
- 解释:将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。子串 “BBBB” 有最长重复字母, 答案为 4。
六【解题思路】
- 利用哈希表和滑动窗口的思想,这道题有难度,尤其是没接触过滑动窗口的读者
- 要明白,我们的滑动窗口中的字符串内容就是我们要求的最长相同字符串内容
- 我们首先要记录每个元素出现的次数,当然是在这个滑动窗口内的字符
- 然后我们使用一个变量记录当前滑动窗口内的最多字符的数量,判断其能否通过调整k次达到滑动窗口的长度,因为这也是一个贪心的策略,滑动窗口的长度就是最长的相同字符的长度
- 如果不能通过调整k次达到滑动窗口的长度,那么就从左边缩小滑动窗口的长度,准备继续向右寻找
- 最后返回滑动窗口的长度就是我们需要的结果
七【题目提示】
- 1 < = s . l e n g t h < = 1 0 5 1 <= s.length <= 10^5 1<=s.length<=105
- s 仅由大写英文字母组成 s 仅由大写英文字母组成 s仅由大写英文字母组成
- 0 < = k < = s . l e n g t h 0 <= k <= s.length 0<=k<=s.length
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
package HashTable;
public class p424_LongestRepeatingCharacterReplacement {
public static void main(String[] args) {
String s = "ABAB";
int k = 2;
int res = characterReplacement(s, k);
System.out.println("res = " + res);
}
public static int characterReplacement(String s, int k) {
int len = s.length();
int[] map = new int[26];
int left = 0;
int right = 0;
int maxSame = 0;
while (right < len) {
int index = s.charAt(right) - 'A';
map[index]++;
maxSame = Math.max(maxSame, map[index]);
int windowsLen = right - left + 1;
if (windowsLen - maxSame > k) {
map[s.charAt(left) - 'A']--;
left++;
}
right++;
}
return right - left;
}
}
- C语言版
#include<stdio.h>
#define max(a,b) ((a) > (b) ? (a) : (b))
int characterReplacement(char * s, int k)
{
int len = strlen(s);
int map[26] = { 0 };
int left = 0;
int right = 0;
int maxSame = 0;
while (right < len)
{
int index = s[right] - 'A';
map[index]++;
maxSame = max(maxSame, map[index]);
int windowsLen = right - left + 1;
if (windowsLen - maxSame > k)
{
map[s[left] - 'A']--;
left++;
}
right++;
}
return right - left;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版