☰
【滑动窗口+计数】LCR015找到字符串中所有字母异位词
2026/10/25 10:07:06 网站建设 项目流程

求解代码

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_字符串的排列 基本一致,只不过有一些细节上的东西需要注意。

比如字符串排列那道题的处理顺序是:

更新计数 ➡️ 判断 ➡️ 移动边界

而这道题是:

更新计数 ➡️ 移动边界 ➡️ 判断

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询