438. Find All Anagrams in a String 寻找字符串种所有的同位串
先说一下题意,给一个字符串S,和一个模式串P,要求找到所有的P的同位串(Anagram)在S种的起始Index,Anagram的意思就是组成字符相同的字符串。这一道题有很多的解法,有一些时间复杂度比较高,这里我们就不多赘述了,就讲一种比较简单,代码量也不大而且时间复杂度为O(N)的解法。
这一种方法主要是使用了滑动窗口和一个字符哈希数组来解决。
主要思维为:
1.新建一个256的数组用来存放当前窗口内所有的字符的个数。
2. 维护一个count 来表示离匹配一个Anagram还需要多少个字符匹配。
3. 将模式串内所有的字符用数组进行统计
4. 设置一个滑动窗口,左右指针,右指针从S的起始向后滑动,遇到的所有字符都在数组内自减1,如果当前的字符在哈希数组内大于0,则说明当前字符出现在了模式串中,将count减一。
5. 如果当前的count等于0 则说明模式串匹配了,将左指针加入到我们要返回的结果中
6. 如果左右指针的差距等于模式串的长度则说明我们需要移动左指针,如果左指针指向的字符在哈希数组中是负数则说明该字符没有出现在模式串中,但如果非负则说明该字符出现在了模式串中,我们每移出一个出现在模式串中的字符,则需要将count加一。
来让我们看一下java实现吧
class Solution{
public List<Integer> findAnagrams(String s, String p){
List<Integer> res = new ArrayList<>();
int[] hash = new int[256];
int l = 0,r = 0;
int count = p.length();
for(char c:p.toCharArray()){
hash[c]++;
}
while(r < s.length()){
if(hash[s.charAt(r++)]-- > 0)count--;
if(count == 0) res.add(l);
if(r - l == p.length() && hash[s.charAt(l++)]++ >= 0)count++;
}
return res;
}
}