python学习3. 无重复字符的最长子串(滑动窗口)

2023-10-27

makcooo 2019-04-19 15:47:32  271  收藏
分类专栏: python
版权
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

原理:记下每个元素的起始位置,默认为-1

如果没有重复,当前位置减去起始位置就是长度。

最大更新一下。

发现一个元素重复,则起始位置更新。

 

start:子串开始位置,默认为-1,如果出现重复字符,则更新到最后一次出现位置。

 


class Solution:
    def lengthOfLongestSubstring(self, s_str):
        start_dict = {}#建立一个开始字典
        start, max_len = -1, 0
        for index in range(len(s_str)):
            if s_str[index] in start_dict:
                start = max(start_dict[s_str[index]], start) #i是目前正在计算的最长字串的起点位置
            max_len = max(max_len, index - start )
            print(index, s_str[index], "max_len", max_len, start_dict,start)
            start_dict[s_str[index]] = index #输入 s[j] :j
        return max_len,start_dict
    """ 
    j 表示子串终止位置,i表示字串起始位置 当未出现重复时,
    字符串的长度即为字符串的结束位置减去起始位置。
    发生重复时,重新利用字符串的结束位置j减去新的起始位置i,
    并与之前的未重复字串的长度作比较取较大者
    """

if __name__ == '__main__':

    sss="aba"
    bbb,start_dict=Solution().lengthOfLongestSubstring(sss)
    print("str_len",len(sss),bbb)
    print(start_dict)

 

原理:使用哈希表存储键值对(key:字符,value:该字符最后一次出现的后一个位置),遍历字符串,若当前字符在哈希表中,则到当前字符为止的最大不重复子串开始位置为“哈希表中该字符的 value 与原开始位置的最大值”,总的最大长度为“原最大长度与当前字符最大长度的最大值”,最后将当前字符的哈希表值更新。

上面是一个滑动窗口的思想,将新的数据与已有的相比较,从索引 i到 j−1 之间的子字符串 s​ 已经被检查为没有重复字符。我们只需要检查 s[j] 对应的字符是否已经存在于子字符串 s中即可

滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i, j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i, j) 向右滑动 1 个元素,则它将变为 [i+1, j+1)(左闭,右开)。

 

返回最大不重复子串,并且返回最大不重复子串。


class Solution:
    def lengthOfLongestSubstring(self, s_str):
        start_dict = {}#建立一个开始字典
        start, max_len = -1, 0
        max_start=0
        for index in range(len(s_str)):
            if s_str[index] in start_dict:
                start = max(start_dict[s_str[index]], start) #i是目前正在计算的最长字串的起点位置
            if index - start>max_len:
                max_start = start+1
            max_len = max(max_len, index - start )

            print(index, s_str[index], "max_len", max_len, start_dict,start)
            start_dict[s_str[index]] = index #输入 s[j] :j
        return max_len,start_dict,max_start
    """ 
    j 表示子串终止位置,i表示字串起始位置 当未出现重复时,
    字符串的长度即为字符串的结束位置减去起始位置。
    发生重复时,重新利用字符串的结束位置j减去新的起始位置i,
    并与之前的未重复字串的长度作比较取较大者
    """

if __name__ == '__main__':

    sss="ababdabcd"
    bbb,start_dict,max_start=Solution().lengthOfLongestSubstring(sss)
    print("str_len",len(sss),bbb,"max_start",max_start)
    # print(start_dict)


————————————————
版权声明:本文为CSDN博主「makcooo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44756223/article/details/89401804

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python学习3. 无重复字符的最长子串(滑动窗口) 的相关文章

  • C++11 -- lambda表达式

    文章目录 lamaba表达式的引入 lambda表达式语法 lamabda达式各部分说明 捕获列表说明 lamaba表达式底层原理探索 lamaba表达式的引入 在C 11之前 如果我们想对自定义类型Goods排序 可以根据姓名 价格 学号

随机推荐

  • git 代码不同版本的对比(IDEA)

    一 和远程文件进行对比 开发过程中我们经常需要在版本的基础上对比和上个版本的代码的区别 那 使用IDEA工具如何对比提交的不同的版本代码呢 打开我们项目的代码 以GIT版本控制为例 找到需要比较的类 右键点击类会弹出如下的选项 选择git
  • 攻防世界ctf-misc-新手联系区-1

    攻防世界ctf misc 新手联系区 1 签到题 比较简单 Most flags are in the form flag xxx for example flag th1s s a d4m0 4la9 flag th1s s a d4m0
  • excel求方差和标准差的函数_Excel标准差_计算函数Stdev和StdevP的使用方法

    Excel标准差 计算函数Stdev和StdevP的使用方法 Excel标准差核算共有六个函数 它们分别用于核算样本标准差和整体标准差 其间一些函数只能核算数值 另一些函数除能核算数值外还能核算文本和逻辑值 另外 假如要求核算满足指定条件的
  • STM32F1----TIM_GENERAL

    1 通用定时器PWM模式初始化流程 lt 1 gt 建立GPIO 时基 输出比较结构体 GPIO InitTypeDef GPIO InitStructure TIM TimeBaseInitTypeDef TIM TimeBaseStru
  • 软件项目管理 3.5.敏捷生存期模型

    前言 大家好 这节我们学习敏捷模型 前面介绍的几种生存期模型在实际应用过程中遇到的一些挑战 有时不能很好地适应需求的快速变化 为此软件界比较流行敏捷生命期模型 一 敏捷模型 敏捷宣言 价值观 原则 和通用实践之间的关系 敏捷模型符合敏捷宣言
  • CNN的重点整理

    1 常用的非线性激活函数 sigmoid tanh relu等等 前两者sigmoid tanh比较常见于全链接层 后者relu常见于卷积层 这里先简要介绍下最基础的sigmoid函数 btw 在本博客中SVM那篇文章开头有提过 sigmo
  • 染色——差分数组板子题

    问题描述 有编号为0到M 的 M 1 个格子 现在有N个操作 x y 表示将从x 到 y的格子染色 问一共有多少个格子被染色 输入 第一行两个整数 分别表示N和M 接下来有N行 每行两个整数 分别表示x和y 输出 输出一个整数 表示有多少个
  • [YOLO专题-12]:YOLO V5 - ultralytics支持的5种不同规模的模型类型比较

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122294915 目录 1 概述 2
  • VR引擎哪家强?主流VR开发引擎大起底

    转载自 http www hiavr com news tech 22826 html ref myread 在VR浪潮面前 Unreal Unity CryENGINE各大游戏引擎纷纷跟进 都决心抓住这个绝无仅有的机会 一举奠定自己的江湖
  • AutoML-A survey of the state-of-the art翻译+总结

    AutoML A Survey of the State of the Art Abstract 深度学习 DL 技术已经渗透到我们生活的各个方面 给我们带来了极大的方便 然而 为特定任务构建高质量的DL系统高度依赖于人类的专业知识 这阻碍
  • Docker 镜像基本命令操作

    目录标题 Docker 镜像基本命令操作 一 Docker 安装 二 镜像操作 Docker 镜像基本命令操作 一 Docker 安装 Docker要求运行在Centos 7上 要求系统为64位 系统内核版本3 10以上 1 uname a
  • 鸿蒙os更新名单,鸿蒙系统首批升级名单 华为鸿蒙系统升级机型名单时间表

    2021年6月2日 在这天华为公布了一直津津乐道的鸿蒙系统 并且推出了HarmonyOS2百机升级计划 一共是分为四个阶段来进行升级 很多朋友还不清楚升级的机型名单和时间都是多少 下面就来为大家分享一下 第一批升级名单 6月2日就可以升级
  • 单电源运放滤波器设计

    在很多情况中 为了阻挡由于虚地引起的直流电平 在 运放的输入端串入了电容 这个电容实际上是一个高通滤波器 在某种意义上说 像这样的单电源运放电 路都有这样的电容 设计者必须确定这个电容的容量必须要比电路中的其他电容器的容量大 100倍以上
  • 模拟开关选型、多路复用器选型

    只列举常用的 芯片均出自TI ADI SGM Nexperia等 国产只考虑CH 泌恒 个人整理 tb均能买到 如有纰漏欢迎纠错
  • 残差网络、Dropout正则化、Batch Normalization浅了解

    残差网络 为什么需要残差网络 残差网络的目的是为了解决深度神经网络在训练过程中遇到的退化问题 即随着网络层数的增加 训练集的误差反而增大 而不是过拟合 残差网络的优点有以下几点 残差网络可以有效地缓解梯度消失或爆炸的问题 因为跳跃连接可以提
  • Python中如何将浮点型数据转换成整型

    在 Python 中 可以使用内置函数 int 将浮点型数据转换为整型 例如 a 3 14 b int a print b 输出结果为 3 注意 转换为整型时 会将浮点数四舍五入到最接近的整数
  • Android 创建淡入淡出动画的详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 介绍 淡入淡出动画 也称为 叠化 逐渐淡出一个 View 或 ViewGroup 同时淡入另一个 此动画适用于您希望在应用中切换内容或视
  • 华为机考 创建二叉树 javascript

    请按下列描达构建一颗二叉树 并返回该树的根节点 1 先创建值为 1的根结点 根节点在第0层 2 然后根据operations依次添加节点 operations i height index 表示对第 height 层的第index 个节点n
  • 适合小白入门Spark的全面教程

    问题导读1 spark有哪些使用场景 2 spark有包含哪些组件 3 spark在哪些厂商已经应用 4 spark如何实现地震检测 Apache Spark是一个用于实时处理的开源集群计算框架 它是Apache软件基金会中最成功的项目 S
  • python学习3. 无重复字符的最长子串(滑动窗口)

    makcooo 2019 04 19 15 47 32 271 收藏 分类专栏 python 版权 给定一个字符串 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 abcabcbb 输出 3 解释 因为无重复字符的最长子串是