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