Leetcode 438. Find All Anagrams in s String
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.
Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.
The order of output does not matter.
Example 1:
Input: s: "cbaebabacd" p: "abc" Output: [0, 6] Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The substring with start index = 6 is "bac", which is an anagram of "abc".
Example 2:
Input: s: "abab" p: "ab" Output: [0, 1, 2] Explanation: The substring with start index = 0 is "ab", which is an anagram of "ab". The substring with start index = 1 is "ba", which is an anagram of "ab". The substring with start index = 2 is "ab", which is an anagram of "ab".
思路:使用滑动窗口的思想
s = cbaebabacd
p = abc
w = [cb]
w+a = [cba],如果counter之后等于counter(p), 输出头index。在remove 第一个字母c的时候,注意这是counter c的value是不是1。如果是1的话,直接remove。不是1的话,减1。
1 from collections import Counter 2 3 class Solution(object): 4 def findAnagrams(self, s, p): 5 """ 6 :type s: str 7 :type p: str 8 :rtype: List[int] 9 """ 10 size = len(p) 11 n = len(s) 12 pCounter = Counter(p) 13 sCounter = Counter(s[:size-1]) 14 15 ans = [] 16 17 for i in range(size-1,n): 18 sCounter[s[i]] += 1 19 if sCounter == pCounter: 20 ans.append(i-size+1) 21 if sCounter[s[i-size+1]] == 1: 22 del sCounter[s[i-size+1]] 23 else: 24 sCounter[s[i-size+1]] -= 1 25 return ans