双指针,滑动窗口
两个要点:
一个左指针记录窗口开始位置,一个右指针记录窗口结束位置。
需要两个数组,一个数组用来记录字符串s1
出现的次数,另一个数组用来维护窗口内字母出现的次数。
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;
}
}
原文:https://www.cnblogs.com/zzzzzy2k/p/14401726.html