zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    区块链钱包应用如何开发
    区块链钱包开发什么是区块链钱包
    FileFilter, FilenameFilter用法和文件排序
    买了个空间玩
    MapReduce
    Java学习笔记六:多态
    Java学习笔记五:复用类
    Java学习笔记二:初始化(三)
    Java学习笔记二:初始化(二)
    Java学习笔记四:static关键字
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14395238.html
Copyright © 2011-2022 走看看