leetcode424 替换后的最长重复字符 java题解

本题是比较典型的滑动窗口问题

这类问题一般通过一个滑动窗口就能在O(N)的时间复杂度下求解

本题可以先退化成考虑K=0的情况,此时题目就变成了求解字符串中最长连续子串长度问题了

我们先可以通过这个特例先了解一下滑动窗口的求解过程

上图的求解过程展示中,窗口从左至右不断扩张/滑动,当窗口触达字符串末尾字符时,运算结束,窗口的宽度为最终结果。初始窗口的宽度为1,我们不断的通过向当前窗口覆盖的子串后面追加一个字符看是否能满足我们的要求,如果满足窗口扩张,如果不满足,窗口向右滑动。

当K>0时,子串的条件变成了允许我们变换子串中的K个字符使其变成一个连续子串

那么这个题的关键点就是我们如何判断一个字符串改变K个字符,能够变成一个连续串

如果当前字符串中的出现次数最多的字母个数+K大于串长度,那么这个串就是满足条件的

我们维护一个数组int[26]来存储当前窗口中各个字母的出现次数,left表示窗口的左边界,right表示窗口右边界

  • 窗口扩张:left不变,right++
  • 窗口滑动:left++, right++

charMax保存滑动窗口内相同字母出现次数的历史最大值,通过判断窗口宽度(right - left + 1)是否大于charMax + K来决定窗口是否做滑动,否则窗口就扩张

完整Java代码

class Solution {
    private int[] map = new int[26];

    public int characterReplacement(String s, int k) {
        if (s == null) {
            return 0;
        }
        char[] chars = s.toCharArray();
        int left = 0;
        int right = 0;
        int charMax = 0;
        for (right = 0; right < chars.length; right++) {
            int index = chars[right] - 'A';
            map[index]++;
            charMax = Math.max(charMax, map[index]);
            if (right - left + 1 > charMax + k) {
                map[chars[left] - 'A']--;
                left++;
            }
        }
        return chars.length - left;
    }
}

原文地址:https://www.cnblogs.com/migoo/p/12227706.html

时间: 2024-10-13 20:17:45

leetcode424 替换后的最长重复字符 java题解的相关文章

[Swift]LeetCode424. 替换后的最长重复字符 | Longest Repeating Character Replacement

Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring containing all repeating letters you can get after performing the abo

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

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

[LeetCode] Longest Repeating Character Replacement 最长重复字符置换

Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring containing all repeating letters you can get after performing the abo

算法练习:求字符串的最长重复子串(Java实现)

1. 求字符串的最长重复子串 例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa 算法思路:算法时间复杂度(O(n)) 1. 将这一个字符串先转成char数组: 2. 将这一char数组进行遍历 3. 比较char数组中第i-1个与第i个的字符是否相等,如果不相等则进行截取字符串长度,然后将其进行比较,如果其长度比现有长度大,则进行替换,否则什么也不做 算法实现:(Java实现) private static String reSubStr(Str

查找字符串中最长重复字符的子串

temppos:记录子字符串开始的下标 list:存放重复的子字符串 public class RepeatString { private static void longestdupString(String s) { if (s == null || s.length() == 0) { return; } char temp = s.charAt(0); int temppos = 0; List<String> list = new ArrayList<String>()

No.3. 无重复字符的最长子串

3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.就是说,找一个最长的子串,这个子串没有重复字符 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew"

Leetcode3---&gt;无重复字符的最长子串长度

题目:给定一个字符串string,找出string中无重复字符的最长子串. 举例: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1. Given "pwwkew", the answer is "wke"

符串的最长无重复字符的子串长度

题目描述: 对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "abcdbefgdchi",12 返回:8 这个题我研究了好半天,确实不好想,看了别人的思路,半天才把代码写出来 分析: 首先定义三个辅助变量: max_len:表示字符串中最长无重复字符的子串长度,也就是函数返回值 map<char, int>:用来存放

求一字符串最长不重复字符子串的长度【Java 版】

一. 前言 最近学习有点断断续续,整理的一些知识点要么不完整,要么完全没搞懂,不好拿上台面,还是先在草稿箱躺着吧.偶尔在浏览大牛博客http://coolshell.cn的时候,发现大牛业余时间也在做编程训练http://coolshell.cn/articles/12052.html,作为一名想励志成为码农的测试猿,更应该在当下多利用业余时间,训练自己的编码能力,掌握好基础.那就开始吧,https://oj.leetcode.com/problems/ 二.正文 1.题目:Longest Su