思路分析
最初的思路是把字符串转为set(),进行对比。
但是有个问题:set() 只能验证s1中所有的元素是否都在s2里,但不能验证s1是否为s2的子串
错误示例
# 执行结果:解答错误
# 通过测试用例:96 / 107
class Solution(object):
def checkInclusion(self, s1, s2):
"""
:type s1: str
:type s2: str
:rtype: bool
"""
set1 = set(s1)
n2 = len(s2)
left = right = 0
for i in range(n2):
set2 = set()
while right < n2:
if s2[right] in set1:
set2.add(s2[right])
right += 1
else:
left = right + 1
right += 1
break
if set2 == set1:
return True
return False
然后又想到了把s1转为字典,再加个固定大小的滑动窗口,依次滑动检验。
这里注意,可以用collections.Counter(),方便统计及增删键值对。
leetcode 提交—正确版本
# 已AC
from collections import Counter
class Solution(object):
def checkInclusion(self, s1, s2):
dic1 = Counter(s1)
N = len(s2)
left = 0
right = len(s1) - 1
dic2 = Counter(s2[0:right])
while right < N:
dic2[s2[right]] += 1
if dic1 == dic2:
return True
dic2[s2[left]] -= 1
if dic2[s2[left]] == 0:
del dic2[s2[left]]
left += 1
right += 1
return False
本地测试
# s1 = "ba"
# s2 = "eidbaooo" # true
# s1 = "acb"
# s2 = "eidbacooo" # true
# s1 = "ab"
# s2 = "eidbabaabooo" # true
# s1 = "acbb"
# s2 = "eidbacooo" # false
s1 = "hello"
s2 = "ooolleoooleh" # false
solution = Solution()
solution.checkInclusion(s1, s2)