String---滑动窗口

思路:

1. 设置一个闭开的集合[i, j);集合的长度为最后结果(j-i+1)

2. i为不重复子字符串的期待,每次遍历j,扩大集合的长度

3. 若在遍历j的时候,出现重复字符,则新集合的开始为j+1;

4. ans,用来记录每次集合的最大值

class Solution {

    public int lengthOfLongestSubstring(String s) {

        //新建数组, 用于包括所有ASCII码的字符串

        int[] index = new int[128];

        int anw = 0;

//开始遍历

        for(int i =0,j =0; j < s.length(); j++){

            //集合的起点

            i = Math.max(index[s.charAt(j)], i);

            //最终长度,为上一次长度或目前集合的最大值

            anw = Math.max(anw, j-i+1);

            //记录当前遍历点的起点

              index[s.charAt(j)] = j + 1;

        }

        return anw;

    }

}


思路:

1. 用一个开放集合记录可能的字符串(i,j)

2. 若符合条件,则j++;不符合条件i++;

3. 用一个count数组来记录每个值出现的次数

4. 若字符串一样,则subString的长度 - maxCount 不会大于k,j向右移

 5. 若长度不一样,则会出现大于k的情况,i向右移

public int characterReplacement(String s, int k) {

        int len = s.length();

        //只有大写英文字母

        int[] count = new int[26];

        int start = 0, maxCount = 0, maxLength = 0;

        for (int end = 0; end < len; end++) {

            //记录每次不一样字母的最大值

            maxCount = Math.max(maxCount, ++count[s.charAt(end) - 'A']);

            while (end - start + 1 - maxCount > k) {

                //将开始字符右移

                count[s.charAt(start) - 'A']--;

                start++;

            }

            //记录每一次变化的长度

            maxLength = Math.max(maxLength, end - start + 1);

        }

        return maxLength;

    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容