
这里我也是没有太懂,只懂个大概,先统计p和当前窗口的字符,后主要在窗口大小固定为 p.length()
,在 s
上滑动做文章,在s里找到p的长度大小,最后直接比较两个频率数组来判断异位词
定长窗口做法
class Solution {
public List<Integer> findAnagrams(String s, String p) {
// 存储结果的列表
List<Integer> ans = new ArrayList<>();
// 创建两个计数器数组,用于统计字符出现频率
int[] cntP = new int[26]; // 统计字符串 p 的字符频率
int[] cntS = new int[26]; // 统计 s 的子串的字符频率
// 统计 p 中每个字符的出现次数
for (char c : p.toCharArray()) {
cntP[c - 'a']++; // 将字符映射到 0-25 的索引
}
// 使用滑动窗口遍历字符串 s
for (int right = 0; right < s.length(); right++) {
// 将当前字符加入窗口(右边界扩展)
cntS[s.charAt(right) - 'a']++;
// 计算当前窗口的左边界
int left = right - p.length() + 1;
// 如果窗口长度不足 p.length(),跳过后续处理
if (left < 0) {
continue;
}
// 检查当前窗口是否是 p 的异位词
if (Arrays.equals(cntS, cntP)) {
ans.add(left); // 如果是,记录起始索引
}
// 将左边界字符移出窗口(为下一次窗口滑动做准备)
cntS[s.charAt(left) - 'a']--;
}
return ans;
}
}