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

  • 相关阅读:
    c# TCP高性能通信
    c#实现的HTTP服务端
    c#的二进制序列化组件MessagePack介绍
    c# 任务超时执行
    c#项目总结
    etcd客户端c#
    开发的服务集群部署方案,以etcd为基础(java)
    udt的java版本judt项目持续升级1.2版本
    udt通信java再次升级1.1版
    (转)Spring Boot(二) & lombok
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14395238.html
Copyright © 2011-2022 走看看