题目内容
https://leetcode-cn.com/problems/find-all-anagrams-in-a-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 pwill 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".
题目思路
本题如果采用每次都进行选中字符串排序对比的话,效率会非常的低,所以我们可以考虑使用滑动窗口的方法进行比对。因为是无序的,所以可以采用字典的方法。同时要保证对窗口的长度进行约束。
程序代码
class Solution(object):
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
dp,ds={},{}
for i in p:
dp[i]=dp.get(i,0)+1
res=[]
lp=len(p)
for i,val in enumerate(s):
ds[val]=ds.get(val,0)+1
if ds==dp:
res.append(i-lp+1)#回退到本次开头
if i-lp+1>=0:
ds[s[i-lp+1]]=ds.get(s[i-lp+1],0)-1
if ds[s[i-lp+1]]==0:
del ds[s[i-lp+1]]
return res