567. 字符串的排列

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

 

示例2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False

 

注意:

  1. 输入的字符串只包含小写字母
  2. 两个字符串的长度都在 [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

 

posted @ 2021-02-10 11:10  XXXSANS  阅读(107)  评论(0编辑  收藏  举报