文章目录
我的方法超时了!超内存了!
class Solution(object):
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
result = []
p = sorted(p)
np = len(p)
ns = len(s)
for left in range(ns):
window = []
window.append(s[left])
right = left + 1
# 如果right不超过s的最大index,并且window窗口小于len(p)
# 则说明window里面还可以加东西
while right < ns and (right - left) < np-1:
window.append(s[right])
window = sorted(window)
if window == p:
result.append(left)
return result
官方的答案1:
- 统计每种字母的数量,这样可以不用对p里面进行排序,就可以节省时间,因为对p进行排序时间复杂度是 O ( n log n ) O(n \log n) O(nlogn),而统计p里面的字母的数量的时间复杂度是 O ( n ) O(n) O(n)
class Solution(object):
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
s_count = [0]*26
p_count = [0]*26
ns = len(s)
np = len(p)
ans = []
# 如果s的长度小于p,那直接返回空列表[]
if ns < np:
return []
# 统计第一个window里面的每种字母的数量
# 统计p里面的每种字母的数量
for i in range(np):
# s_count就是移动的窗口window
s_count[ord(s[i]) - 97] += 1
# p_count就是匹配的模版
p_count[ord(p[i]) - 97] += 1
# s_count[s[i] - 'a'] += 1 # 这样写是不对的,string里面是unicode编码
# p_count[p[i] - 'a'] += 1
# 检查第一个window的匹配情况
if s_count == p_count:
# return [0]
ans.append(0)
# 第2个window,第3个window...
for i in range(ns - np):
s_count[ord(s[i]) - 97] -= 1
s_count[ord(s[i+np]) - 97] += 1
# 检查这个window的匹配情况
if s_count == p_count:
ans.append(i+1)
return ans