• 【LeetCode每日一题】——424.替换后的最长重复字符


    一【题目类别】

    • 哈希表

    二【题目难度】

    • 中等

    三【题目编号】

    • 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)

    九【代码实现】

    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;
        }
    
    }
    
    1. C语言版
    #include
    
    #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;
    }
    
    /*主函数省略*/
    

    十【提交结果】

    1. Java语言版
      在这里插入图片描述

    2. C语言版
      在这里插入图片描述

  • 相关阅读:
    视锥体裁剪射线的算法
    城市区县级数字孪生智慧水务信息化建设思考
    【Vue】vue先转化文章内容再去除标签 vue filters过滤器去除标签 js提取文字内容
    Java设计模式(上)
    蓝牙核心规范(V5.4)10.5-BLE 入门笔记之HCI
    Bruker AXS布鲁克衍射仪电源维修XRD高压发生器维修概述
    十年测试老鸟聊聊移动端兼容性测试
    Flink之DataStream API开发Flink程序过程与Flink常见数据类型
    数据中台:数据治理概述
    Python基础之装饰器
  • 原文地址:https://blog.csdn.net/IronmanJay/article/details/127118068