本文共 1262 字,大约阅读时间需要 4 分钟。
给定一个只含大写字母的字符串 s s s,允许将其中最多 k k k个字母变成某另一个大写字母。问变换后能得到的由相同字母组成的最长子串的长度是多少。
思路是双指针。用左右两个指针 j j j和 i i i维护区间 [ j , i ] [j,i] [j,i],并用一个数组 c c c维护 [ j , i ] [j,i] [j,i]这个区间每个字母出现次数。当区间里字母总数减去出现次数最多的字母的出现次数大于 k k k了,那么当前区间已经无法通过改变 k k k个字母变成相同字母的子串了,此时要右移左指针 j j j,直到可以。可以了之后,用区间长度 i − j + 1 i-j+1 i−j+1更新答案。代码如下:
public class Solution { /** * @param s: a string * @param k: a integer * @return: return a integer */ public int characterReplacement(String s, int k) { // write your code here int[] count = new int[26]; int res = 0; for (int i = 0, j = 0; i < s.length(); i++) { // 维护一下区间每个字母的计数 count[s.charAt(i) - 'A']++; // 如果计数不满足条件,则右移左指针 while (!check(count, k)) { count[s.charAt(j) - 'A']--; j++; } // 出了while就满足条件了,更新答案 res = Math.max(res, i - j + 1); } return res; } private boolean check(int[] count, int k) { int sum = 0, max = 0; for (int i : count) { sum += i; max = Math.max(max, i); } return sum - max <= k; }}
时间复杂度 O ( l s ) O(l_s) O(ls),空间 O ( 1 ) O(1) O(1)。
转载地址:http://xkjs.baihongyu.com/