给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = "ab" s2 = "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba").
示例2:
输入: s1= "ab" s2 = "eidboaoo" 输出: False
注意:
- 输入的字符串只包含小写字母
- 两个字符串的长度都在 [1, 10,000] 之间
一次过~
class Solution: def checkInclusion(self, s1: str, s2: str) -> bool: res=0 if s1==s2:return True if len(s1)>len(s2):return False cnt1=collections.defaultdict(int) for char in string.ascii_lowercase: cnt1[char]=0 for char in s1: cnt1[char]+=1 cnt2=collections.defaultdict(int) for char in string.ascii_lowercase: cnt2[char]=0 for char in s2[:len(s1)]: cnt2[char]+=1 def check(cnt2): for char in cnt2: if cnt2[char]!=cnt1[char]: return False return True if check(cnt2):return True l=1 r=len(s1) while r<len(s2): cnt2[s2[r]]+=1 cnt2[s2[l-1]]-=1 if check(cnt2): return True else: l+=1 r+=1 return False
发现两个dictionary可以直接用“==”来比较
class Solution: def checkInclusion(self, s1: str, s2: str) -> bool: res=0 if s1==s2:return True if len(s1)>len(s2):return False cnt1=collections.defaultdict(int) for char in string.ascii_lowercase: cnt1[char]=0 for char in s1: cnt1[char]+=1 cnt2=collections.defaultdict(int) for char in string.ascii_lowercase: cnt2[char]=0 for char in s2[:len(s1)]: cnt2[char]+=1 if cnt1==cnt2:return True l=1 r=len(s1) while r<len(s2): cnt2[s2[r]]+=1 cnt2[s2[l-1]]-=1 if cnt1==cnt2: return True else: l+=1 r+=1 return False
发现
collections.defaultdict(int)
可以对新加入字典的元素直接执行+=1操作
抓住核心,继续简化代码
class Solution: def checkInclusion(self, s1: str, s2: str) -> bool: n1, n2 = len(s1), len(s2) if n1>n2:return False cnt1 = collections.defaultdict(int) cnt2 = collections.defaultdict(int) for char in s1: cnt1[char] += 1 for i in range(n1): cnt2[s2[i]] += 1 if cnt1==cnt2: return True for i in range(n1, n2): cnt2[s2[i-n1]] -= 1 if cnt2[s2[i-n1]]==0: del cnt2[s2[i-n1]] cnt2[s2[i]] += 1 if cnt1==cnt2: return True return False