核心内容摘要
顶刊的两大支柱硬的逻辑与软的叙事
求解代码publicListIntegerfindAnagrams(Strings,Stringp){ListIntegeransnewArrayList();if(s.length()p.length()){returnans;}int[]arrPnewint[26];// 统计p的字符出现次数int[]arrSnewint[26];// 统计s滑动窗口内的字符出现次数for(inti0;ip.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, p.length()-1]右边界从p.length()开始intleft0;intrightp.length();while(rights.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_字符串的排列 基本一致只不过有一些细节上的东西需要注意。
比如字符串排列那道题的处理顺序是更新计数 ➡️ 判断 ➡️ 移动边界而这道题是更新计数 ➡️ 移动边界 ➡️ 判断