Leetcode 424.替换后的最长重复字符

424.替换后的最长重复字符

  • 前言
  • 一、题目描述
  • 二、分析及代码
    • 滑动窗口
  • 三、总结


前言

二月,双指针月?


提示:以下是本篇文章正文内容,下面解法可供参考

一、题目描述

示例:给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:字符串长度 和 k 不会超过 104。
示例 1:
输入:s = “ABAB”, k = 2
输出:4
解释:用两个’A’替换为两个’B’,反之亦然。
示例 2:
输入:s = “AABABBA”, k = 1
输出:4
解释:
将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。
子串 “BBBB” 有最长重复字母, 答案为 4。

二、分析及代码

滑动窗口

  1. 我们可以从字符串左端开始遍历,依次记录出现的字符,运用贪心思想,每次将不同的字符改为当前重复数最多的字符,当需要改变的字符数大于k时,记录下当前窗口覆盖的字符串的长度,此时滑动窗口不能再继续移动;
  2. 因为题中要求找出最长,所以我们维护此时长度ret,将滑动窗口向右移动一位,继续进行上述操作;
  3. 当窗口右边界到达字符串最后一个字符时,运算结束,返回当前ret。

代码如下(示例):

int characterReplacement(char * s, int k){
     
    int *map = (int*)malloc(26*sizeof(int));//哈希表
    int left = 0, right = 0,max = 0, ret = 0;//滑动窗口左右边界、某一字母最大重复数、返回结果
    int len = strlen(s);
    for(int i = 0;i < 26;i++){
     
        map[i] = 0;
    }//初始化哈希表
    while(right < len){
     
        map[s[right]-'A']++;
        max = fmax(max,map[s[right]-'A']);
        if(right - left + 1 - max > k){
     
            map[s[left]-'A']--;
            left++;//当前滑动窗口内仅改变k个字符无法实现所有字符相同,此时滑动窗口向左移动移位
        }
        ret = fmax(ret,right - left + 1);//维护当前最长重复字串长度
        right++;
    }
    return ret;
}

三、总结

思路不复杂,代码有很多细节需要注意。

你可能感兴趣的:(LeetCode,刷题,字符串,leetcode,算法)