题目描述:
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。(find-all-anagrams-in-a-string)
示例:
输入:s: "cbaebabacd" p: "abc"
输出:[0, 6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
思路:
固定长度为len(p)的窗口向前移动,判断窗口是否为p的字母异位词的子串
代码:
# 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。(find-all-anagrams-in-a-string)
# 输入:s: "cbaebabacd" p: "abc"
# 输出:[0, 6]
# 解释:
# 起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
# 起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
#思路:
# 固定长度为len(p)的窗口向前移动,判断窗口是否为p的字母异位词的子串
def String2Map(s):
#把字符串改写为字典形式
#输入:'aabc'
#输出:{'a':2,'b':1,'c':1}
dict_map = {}
for i in s:
if i in dict_map:
dict_map[i] += 1
else:
dict_map[i] = 1
return dict_map
def findAnagrams(s,p):
#p的长度,即我们固定的窗口长度
length=len(p)
#用字典来确定两字符串是否一致
p_map=String2Map(p)
#储存结果
res=[]
for i in range(len(s)-length+1):
#窗口对应字典和所需字典一致且字符串不同时记录下标
if String2Map(s[i:i+length])==p_map and s[i:i+length]!=p:
res.append(i)
return res
s="cbaebabacdabc"
p="abc"
print(findAnagrams(s,p))