题目描述
给定一个字符串s和一个非空字符串p,找到s中所有是p的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串s和p的长度都不超过20100。
- 说明
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
- 示例1
输入: s: "cbaebabacd" p: "abc"
输出: [0, 6]
解释: 起始索引等于0的子串是"cba",它是"abc"的字母异位词。
起始索引等于6的子串是"bac",它是"abc"的字母异位词。
- 示例2
输入: s: "abab" p: "ab"
输出: [0, 1, 2]
解释: 起始索引等于0的子串是"ab",它是"ab"的字母异位词。
起始索引等于1的子串是"ba",它是"ab"的字母异位词。
起始索引等于2的子串是"ab",它是"ab"的字母异位词。
游标字典法
使用字典可避免超出时间限制,游标的使用在于是否超过字符串p的长度,超过则使当前位置的字符次数减一,否则进行比较字典中的元素。
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
s_len, p_len = len(s), len(p)
if s_len < p_len:
return []
res = []
compare_dict = {}
for pu in p:
compare_dict[pu] = compare_dict.get(pu, 0) + 1
current_dict = {}
for sk, su in enumerate(s):
current_dict[su] = current_dict.get(su, 0) +1
if current_dict == compare_dict:
res.append(sk-p_len+1)
if sk-p_len+1 >=0:
current_dict[s[sk-p_len+1]] = current_dict.get(s[sk-p_len+1]) -1
if current_dict[s[sk-p_len+1]] == 0:
del current_dict[s[sk-p_len+1]]
return res
(最近更新:2019年05月15日)
本文介绍了一种利用字典和游标技术在给定字符串中查找所有与目标字符串构成字母异位词的子串方法,详细阐述了算法原理并提供了Python实现代码。
1787

被折叠的 条评论
为什么被折叠?



