leetcode 字符串的排列 python3

news/2024/7/5 14:46:14

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

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

示例1:

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

示例2:

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

注意:

输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间

1 初始化滑动窗口,其长度为s1的长度
2 只需要判断滑动窗口中字母出现的频率是否与s1相同即可
3 利用哈希表储存s1中字母出现的频率,利用count总计数判断是否已经匹配
4 不断滑动窗口,分别对离开窗口和进入窗口的字母进行哈希表加减操作和count加减操作。

class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        if len(s1) > len(s2):
            return False
        dic_1 = {k:0 for k in string.ascii_lowercase}
        dic_2 = {k:0 for k in string.ascii_lowercase}
        for i in s1:
            dic_1[i] += 1
        
        for j in range(len(s2)):
            dic_2[s2[j]] += 1

            if j >= len(s1):
                dic_2[s2[j-len(s1)]] -= 1

            if dic_1 == dic_2:
                return True
        
        return False



class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        len_1, len_2 = len(s1), len(s2)
        if len_1 > len_2:
            return False
        char_count_1 = [0 for i in range(26)]
        char_count_2 = char_count_1.copy()
        ascii_a = ord('a')
        for i in range(len_1):
            char_count_1[ord(s1[i]) - ascii_a] += 1
            char_count_2[ord(s2[i]) - ascii_a] += 1
        for i in range(len_1, len_2):
            if self.isEqual(char_count_1, char_count_2):
                return True
            char_count_2[ord(s2[i - len_1]) - ascii_a] -= 1
            char_count_2[ord(s2[i]) - ascii_a] += 1
        return self.isEqual(char_count_1, char_count_2)

    def isEqual(self, char_count_1, char_count_2):
        for i in range(26):
            if char_count_1 != char_count_2:
                return False
        return True



http://www.niftyadmin.cn/n/4352410.html

相关文章

python高级应用_Python高级应用程序设计任务

一、主题式网络爬虫设计方案(15分)1.主题式网络爬虫名称关于链家泉州本地租房信息的爬虫2.主题式网络爬虫爬取的内容与数据特征分析2.1爬取的内容租房类型,所属区县,详细地址,房屋面积,房屋朝向,房屋房型,房…

计划的定义与要素

要素:目标、时间、方案。 提出在未来一定时期内要达到的组织目标以及实现目标的方案途径。 http://wiki.mbalib.com/wiki/计划 可以把计划的内容简要地概括为八个方面,即: What(什么)——计划的目的、内容; Who(谁&…

微信小程序 Array对象操作

转载于:https://www.cnblogs.com/liudabao123/p/8329642.html

《Java字节码浅析(二)》

条件语句 像if-else, switch这样的流程控制的条件语句,是通过用一条指令来进行两个值的比较,然后根据结果跳转到另一条字节码来实现的。 循环语句包括for循环,while循环,它们的实现方式也很类似,但有一点不同&#x…

LeetCode 字符串相乘 python3

描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 示例 输入: num1 "123", num2 "456" 输出: "56088"class Solution:def multiply(self, num1: str, …

python中如何对一个属性或方法进行封装_中级软件设计师下半年上午试题附答案解析.doc...

1.在程序执行过程中,Cache与主存的地址映射是由()完成的。A.操作系统B.程序员调度C.硬件自动D.用户软件2.某四级指令流水线分别完成取指、取数、运算、保存结果四步操作。若完成上述操作的时间依次为8ns、9ns、4ns、8n…

LeetCode 翻转字符串里的单词 python3

给定一个字符串,逐个翻转字符串中的每个单词。 说明: 无空格字符构成一个 单词 。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。…

Java字节码浅析(三)

从Java7开始,switch语句增加了对String类型的支持。不过字节码中的switch指令还是只支持int类型,并没有增加对其它类型的支持。事实上switch语句对String的支持是分成两个步骤来完成的。首先,将每个case语句里的值的hashCode和操作数栈顶的值…