【题解】力扣424. 替换后的最长重复字符

题目来源

567. 字符串的排列

思想及算法

双指针,滑动窗口

两个要点:

  1. 子串是连续的
  2. 第一个字符串不管怎样排序,出现的字符的次数是一定的,所以记录字符出现的频次即可。

一个左指针记录窗口开始位置,一个右指针记录窗口结束位置。

需要两个数组,一个数组用来记录字符串s1出现的次数,另一个数组用来维护窗口内字母出现的次数。

  • 窗口扩张:left不变,right++
  • 窗口滑动:left++,right++
class Solution {
    public boolean checkInclusion(String s11, String s22) {
		char[] s1 = s11.toCharArray();
        char[] s2 = s22.toCharArray();
        int len_1 = s1.length;
        int len_2 = s2.length;
        
        int[] freq_1 = new int[26];	// 记录s1字符串的字母出现的频率次数
        int[] freq_2 = new int[26];	// 记录窗口内字符串的字母出现的频率次数
        for(int i = 0;i<len_1;i++){	
            freq_1[s1[i]-'a']++;
        }
        
        int left = 0;
        int right = 0;
        while(right < len_2){
            freq_2[s2[right]-'a']++;
            if(right-left+1>len_1){	// 窗口长度大于s1的字符串
                freq_2[s2[left]-'a']--;	// 去掉左边的字符,左指针向右移动
                left++;
            }
            if(Array.equals(freq_1, freq_2)){	// 如果两个数组记录的字符频次相同,即s2字符串包含了s1的字符串
                return true;
            }
            right++;
        }
        return false;
    }
}
posted @ 2021-02-14 11:52  zzzzzy2k  阅读(76)  评论(0编辑  收藏  举报