IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python leetcode 567 字符串的排列【中等题】 -> 正文阅读

[数据结构与算法]python leetcode 567 字符串的排列【中等题】

一 读懂题目

二.?分析,推导解法,产生思路。

解题思路:

转化:排列 => 两个字符串中每个字符出现的次数均相等; => 关注字符种数与次数

s1的长度即为滑动窗口大小。暴力解法:遍历s2,维持一个固定大小滑动窗口,比较s2窗口子串与s1字符串对应字符及次数是否相同。

优化方法:注意短子串存在目标子串,则长子串(在短子串前后加字符形成的长子串)也包含目标子串。

三 代码实现

注意:

winCount 的含义:滑动窗口中的字符要满足字符出现的次数 大于等于 s1 中对应字符出现的次数的时候才加1,
winCount 不仅统计了种类,还代表了次数。使得我们可以通过 winCount 的数值去了解整个滑动窗口的信息。

dict_s1 ={}
        dict_s2 = {}

        for i in range(len(s1)):
            if s1[i] not in dict_s1:
                dict_s1[s1[i]] = 1
            else:
                dict_s1[s1[i]] += 1
            
        pCount = len(dict_s1)   # 计算s1中字符出现的次数
        winCount = 0

        # 遍历S2
        right = 0
        left = 0
        while right < len(s2):
            # 右指针
            # 计算dict_s2的字符及次数
            if s2[right] not in dict_s2:
                dict_s2[s2[right]] = 1
            else:
                dict_s2[s2[right]] +=1
            # 判断s2中是否存在与s1,字符及次数相同的情况
            if s2[right] in dict_s1:    # 先判断s1中是否存在字符s2[right]
                if dict_s2[s2[right]] == dict_s1[s2[right]]:    # 判断字符s2[right]在两个子串中出现次数是否相同
                    winCount += 1
            right += 1  # 右指针右移

            # 左指针:当当前子串含有目标子串(s1)时,左指针才右移
            while pCount == winCount:
                if right - left == len(s1): # 当前子串与固定窗口一样大,则找到目标子串
                    return True
                # 当前子串与固定窗口一样大, 移动左指针
                if s2[left] in dict_s1:
                    dict_s2[s2[left]] -= 1
                    if dict_s2[s2[left]] < dict_s1[s2[left]]:
                        winCount -= 1   # 当前子串不含有目标子串,左指针停止右移,右指针再次右移
                left += 1

        return False

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:37:50  更:2021-09-02 11:40:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:54:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码