相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int n = s.length();
int m = p.length();
int[] sints = new int[26];
int[] pints = new int[26];
ArrayList<Integer> res = new ArrayList<>();
//把p字符串的元素出现次数存进pints数组中
for (int i = 0; i < m; i++) {
pints[p.charAt(i)-'a']++;
}
//l是用来滑动窗口时,减去最左边的元素出现的个数,用于限制窗口长度
for (int r = 0,l=0; r < n; r++) {
sints[s.charAt(r)-'a']++;//添加当前元素在s字符串出现的次数+1,存进sints数组中
//这里最难理解
if (r-l+1>m){//当这个成立时候,说明窗口的下标已经超过m的长度了。要删除窗口最左边的元素个数,让窗口保持和m长度一致
sints[s.charAt(l++)-'a']--;
}
if (check(sints,pints)){//当此成立时说明两个数组中出现元素的次数一致,可添加进列表
res.add(l);//因为l一直都是滑动窗口的最左边元素,所以直接添加l下标就行
}
}
return res;
}
public boolean check(int[] sints,int[] pints){
for (int i = 0; i < 26; i++) {
if (sints[i]!=pints[i]){
return false;
}
}
return true;
}
}