题目来源于力扣。
如下论述和代码,我们均假设两个字符串s = "cbaebabacd"
, p = "abc"
,进行探究。
此题我们的思路可以是如下:
(1)首先对p字符串中出现的各个字母出现的次数做统计,用一个整型数组存储
(2)定义一个新的整型数组,用于存储s字符串中子串每个字母出现的次数;借助滑动窗口的思想,分别定义左右指针,初始时索引均为0,右指针循环向后移动,并更新数组,直到左右指针之间的子串长度与p字符串长度相等时,比较两个数组是否相等,若相等,将左指针添加到索引列表中,同时再次更新数组,进行下一次循环
大体上的执行过程如下:
`
根据如上思想,可以编写代码如下:
class Solution {
public List<Integer> findAnagrams(String s, String p) {
//如果s字符串长度比p还小
if(s.length()<p.length()){
return new ArrayList<Integer>();
}
//count数组存储p字符串每个字母出现的次数
int[] count=new int[26];
for (int i=0;i<p.length();i++){
count[p.charAt(i)-'a']++;
}
//s="cbaebabacd" p="abc"
//定义左指针
int left=0;
//定义s_count数组存储s字符串中每个字母出现的次数,动态更新
int[] s_count=new int[26];
//存放子串匹配的索引
ArrayList<Integer> arr = new ArrayList<>();
//定义右指针
for(int right=0;right<s.length();right++){
s_count[s.charAt(right)-'a']++;
//当子串长度和p字符串长度相等时,比较count和s_count数组是否相等
if (right-left+1 == p.length()){
if(Arrays.equals(count,s_count)){
//数组相等,则向arr数组添加子串的起始索引
arr.add(left);
}
//添加完后,由于左指针要向右滑动,需要把左指针处的字母出现次数-1,以免影响后续比较
s_count[s.charAt(left)-'a']--;
left++;
}
}
return arr;
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容