求解代码
publicList<Integer>findAnagrams(Strings,Stringp){List<Integer>ans=newArrayList<>();if(s.length()<p.length()){returnans;}int[]arrP=newint[26];// 统计p的字符出现次数int[]arrS=newint[26];// 统计s滑动窗口内的字符出现次数for(inti=0;i<p.length();i++){arrP[p.charAt(i)-'a']++;// p的第i个字符对应数组下标,计数+1arrS[s.charAt(i)-'a']++;// 先统计s前p.length()个字符的计数}// 用于比较两个数组的内容是否完全相等if(Arrays.equals(arrP,arrS)){ans.add(0);}// 初始窗口是[0, p.length()-1],右边界从p.length()开始intleft=0;intright=p.length();while(right<s.length()){// 右边界字符加入窗口:计数+1arrS[s.charAt(right)-'a']++;// 左边界字符移出窗口:计数-1arrS[s.charAt(left)-'a']--;// 窗口右移:左、右边界各+1left++;right++;// 此时窗口起始下标是left,判断是否匹配if(Arrays.equals(arrP,arrS)){ans.add(left);}}returnans;}小贴士
这道题思路和 【滑动窗口+字符计数数组】LCR_014_字符串的排列 基本一致,只不过有一些细节上的东西需要注意。
比如字符串排列那道题的处理顺序是:
更新计数 ➡️ 判断 ➡️ 移动边界
而这道题是:
更新计数 ➡️ 移动边界 ➡️ 判断