题目描述
给定两个字符串 s 和 p,找到 s中所有 p的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
438. 找到字符串中所有字母异位词 - 力扣(LeetCode)
思路
维护一个定长的滑动窗口,长度为p的长度,在s上滑动,每次判断窗口中的子串是否为p的异位词
注意到对于所有字母异位词,字符串中每个字母出现的频次是相同的。所以使用频率表判断窗口中的子串是否满足要求(也可以使用hashmap)
代码
java
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] sfreq = new int[26];
int[] pfreq = new int[26];
List<Integer> ans = new ArrayList<>();
int l=1,r=p.length();
if(p.length()>s.length()) return ans;
for(int i=0;i<p.length();i++){
sfreq[s.charAt(i)-'a']++;
pfreq[p.charAt(i)-'a']++;
}
if(Arrays.equals(sfreq,pfreq)) ans.add(0);
while(r<s.length()){
sfreq[s.charAt(l-1)-'a']--;
sfreq[s.charAt(r)-'a']++;
if(Arrays.equals(sfreq,pfreq)){
ans.add(l);
}
l++;
r++;
}
return ans;
}
}