滑动窗口
public static List<Integer> findAnagrams(String s, String p) {
int slen=s.length();
int plen=p.length();
//处理特殊情况
if (slen==0||plen==0||slen<plen) return new ArrayList<>();
//定义返回结果集
ArrayList<Integer> list=new ArrayList<Integer>();
char[] charArrayP=p.toCharArray();
//定义win数组:计算窗口中是否有charArrayP中的元素
int[] win=new int[128];
//定义need数组:记录charArrayP中每一个元素个数
int[] need=new int[128];
//将charArrayP中元素存入need数组中
for (char c:charArrayP){
need[c]++;
}
//定义左右窗口指针
int right=0,left=0;
//滑动窗口开始
while(right<s.length()){
char c=s.charAt(right);
//存入win数组中
win[c]++;
//左窗口不断移动
right++;
//当滑动窗口中 c 元素比需要的 c 元素多时
while (win[c]>need[c]){
char cL=s.charAt(left);
//左窗口即将移动,左窗口对应的元素计数减一
win[cL]--;
//左窗口向右移动
left++;
}
//当窗口长度等于字符串p长度时表示刚刚好满足题目要求
if (right-left==plen){
//记录左窗口
list.add(left);
}
}
return list;
}
学以致用
当前滑动窗口模板:
- 1、将第right个存入win数组
- 2、右窗口右移
- 3、比较窗口中 s.charAt(right) 元素与需要的元素(大于 :将win数组中左窗口对应元素计数减一、左窗口右移)
- 4、判断窗口长度与p字符串长度(等于:记录左窗口)