无重复字符的最长子串

关于无重复字符的最长子串的解法 在上一节中,我们使用双端队列完成了滑动窗口的一道颇为困难的题目,以此展示了什么是滑动窗口。在本节中我们将继续深入分析,探索滑动窗口题型一些具有模式性的解法。 01、滑动窗口介绍 对于大部分滑动窗口类型的题目,一般是考察字符串的匹配。比较标准的题目,会给出一个模式串B,以及一个目标串A。然后提出问题,找到A中符合对B一些限定规则的子串或者对A一些限定规则的结果,最终再将搜索出的子串完成题意中要求的组合或者其他。 比如:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,. 阅读详情

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

示例 1:

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

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

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

提示:

0 <= s.length <= 5 * 10410^4104
s 由英文字母、数字、符号和空格组成

解法1:动态规划

我对动态规划方法的总结是:按照定义找出递推公式;最好手写一个简单例子的解决过程。

设f(i,j)f(i,j)f(i,j)表示子串从 iii 到 jjj 是否是一个无重复的子串,0表示否,1表示是。f(i,j)f(i,j)f(i,j) 是无重复子串,那么 f(i,j−1)f(i,j-1)f(i,j−1) 也一定是(当然 f(i+1,j)f(i+1,j)f(i+1,j) 也是)。因此递推公式是:

f(i,j)={1i=js[i]!=s[j]i+1=js[j]∉s[i:j]i+1<jf(i,j) = \begin{cases} 1 & {i=j}\\s[i]!=s[j] &{i+1=j}\\s[j] \notin s[i:j] & {i +1<j} \end{cases}f(i,j)=⎩⎨⎧​1s[i]!=s[j]s[j]∈/s[i:j]​i=ji+1=ji+1<j​

    def lengthOfLongestSubstring(self, s: str) -> int:
        length = 0
        sub = ''
        if len(s) <= 1:
            return len(s)
        dp = [[0] * len(s) for i in range(len(s))]
        for i in range(len(s)-1, -1, -1):
            for j in range(i, len(s)):
                if i==j:
                    dp[i][j]=1
                    if 1 > length:
                        length = 1
                        sub = s[i]
                elif i + 1 == j:
                    if s[i] != s[j]:
                        dp[i][j] = 1
                        if 2 > length:
                            length = 2
                            sub = s[i:j+1]
                    else:
                        break
                elif i+1 < j:
                    if s[j] not in s[i:j]:
                        dp[i][j] = 1
                        if (j-i+1) > length:
                            length = j-i+1
                            sub = s[i:j+1]
                    else:
                        break

        return length, sub

注意代码的20,28行,如果写个例子就会发现,当 f(i,j)f(i,j)f(i,j) 是0的时候, f(i,k)k>jf(i,k) \quad k>jf(i,k)k>j 都是0。

解法2

动态规划法在leecode中会超时,动态规划解法的复杂度是 O(n2)O(n^2)O(n2)。这个问题可以在 O(n)O(n)O(n) 的时间内解决。

def lengthOfLongestSubstring(self, s):
    st = {} #记录字符串中每个字符的最大位置
    i, ans = 0, 0 #i是一个指针,指向离当前位置最近的一个重复字符的位置
    for j in range(len(s)):
        if s[j] in st:
            i = max(st[s[j]], i)
        ans = max(ans, j - i + 1)
        st[s[j]] = j + 1
    return ans

从头遍历字符串 sss,用 ststst 记录每个字符的位置(从1开始),如果没有重复字符,遍历结束后最后一个字符位置就是题目的解,但是如果遇到重复字符,重复字符前的子串就是目前最长的子串,如果存在更长的子串,必然从重复字符位置开始算,所以用 iii 记住这个重复字符的位置,代码里主循环的7,8行好理解,5,6行可以拿例子:abba 来理解。

LeetCode——3. 无重复字符的最长子串 目录题目1.链接2.题目描述3.解题思路4.题解 题目 1.链接 传送门–>3. 无重复字符的最长子串. 2.题目描述 3.解题思路 思路和算法 我们先用一个例子考虑如何在较优的时间复杂度内通过本题。 我们不妨以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串: 以 (a)bcabcbb 开始的最长字符串为 (abc)ab 阅读详情

相关推荐

leetcode 3 无重复字符的最长子串

这是刚刚学到的算法——滑动窗口法Sliding Window, 题目如下 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入...

ayang818 's blog 721

算法无重复字符的最长子串

无重复字符的子串是指在一个字符串中,没有任何字符重复出现的连续子序列。例如,在字符串 “abcabcbb” 中,最长的无重复字符子串是 “abc”,长度为3。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 2164

因内存不足原因导致fragment空白解决方案

在androidx之前,一般我们防止Fragment重建是在actvitity的onCreate方法中使用savedInstanceState?.remove(“android:support:fragments”)或者savedInstanceState?但是在androidx中,使用这两行代码不生效,但是看FragmentActivity中的FRAGMENT_TAG还是android:support:fragments,那为什么会不生效呢,后来点进去看发现。

qq_39431405的博客 548

C++算法:无重复字符的最长子串

题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: “pwwkew” 输出: 3 解释: ...

ZHAO 4244

VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理

1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装

wolf1105的博客 3533

国产NAS哪家强?极空间&绿联&威联通&群晖对比

随着个人数据量暴增,传统网盘空间不足和下载速度慢问题愈发凸显。新势力NAS,作为数据管理领域的璀璨新星,正以其独特的互联网设计理念,引领家庭及小型办公用户向数据存储的新纪元。它不仅仅是一款产品,更是为初学者用户量身定制的贴心伙伴。其系统界面之简洁、操作流程之直观,让人一目了然,真正实现了“即插即用”的极致便捷。同时,新势力NAS在保持专业水准的同时,更提供了多样化的扩展性配置,轻松应对各种数据存储与管理需求,让家庭及小型办公场景下的数据管理变得前所未有的简单与高效。

专注大数据、云计算、人工智能、机器人领域技术传播 3647

c语言 无重复字符的最长子串

哈希,滑动数组,动态规划

YSY0112的博客 3345

深度学习二分类实战:用Python+Keras搞定基因表达数据预测(附完整代码)

本文详细介绍了如何使用Python和Keras构建深度学习模型进行基因表达数据的二分类预测。通过数据预处理、特征选择、神经网络构建及优化策略,特别针对小样本场景提供了调参技巧和模型解释方法。文章还包含完整的代码示例,帮助读者快速掌握深度学习在生物信息学中的应用。

weixin_30642561的博客 245

每日一题——无重复字符的最长子串

每日一题——无重复字符的最长子串

zxjiaya的博客 1045

Xlinx PG151 除法器IP 笔记

对Xlinx 除法器IP PG151中部分内容记录备忘。

weixin_50515160的博客 2528

AD9371 官方例程构建及单音信号收发

项目构建基本流程和AD9361差不多,由于官方使用的ZCU102,记录下移植遇到的一些问题最终接收到正确的正弦波Errors: 0Errors: 0Errors: 0Errors: 0AD9361。

weixin_44630490的博客 2973

无重复字符的最长子串(Java 详解)

这个算法的关键在于通过滑动窗口的方式,动态地调整窗口的大小,以保持窗口内的字符都不重复,并且在遍历过程中不断更新最大子串的长度。这样可以在一次遍历中解决问题,而不需要额外的循环来检查所有可能的子串。时间复杂度为O(n),其中n是字符串的长度。解决这个问题的关键在于使用滑动窗口和哈希集来维护一个当前不含重复字符的子串。,请你找出其中不含有重复字符的。

weixin_48751586的博客 2105

【产品】 产品设计:ID设计和MD设计详解

1、ID(Industry Design)工业设计 包含外观、材质、手感、颜色配搭,主要界面的实现与及色彩等方面的设计。 2、MD(Mechanical Design)结构设计 以手机为例: 前壳、后壳、手机的摄像镜头位置的选择、固定的方式、电池如何连接和手机的厚薄程度等。 如果是滑盖手机,如何让手机滑上去,怎样实现自动往上弹,SIM卡怎样插和拔的安排,这些都是手机结构设计的范畴。 繁...

产品线负责人 3万+

LeetCode之无重复字符的最长子串

文章目录LeetCode刷题之无重复字符的最长子串题目描述示例解题方法代码leetcode展示 LeetCode刷题之无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 示例 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为...

程序员大航子 1411

豆包手机为什么能自己“玩手机”?原理是什么?豆包手机系统运行机制深度解析:读屏、抓取、推理链路全拆解

作为一个每天被前端 Bug 打醒的程序员,我这一阵子在关注“豆包手机”这个关键词,刷到的相关视频简直铺天盖地。朋友们,说句实话,我一开始也只是抱着“看看热闹”的心态,最近一位博主下面的内容,不是“它能做什么”,而是。如果你之前看过很多评测,这篇文章会给你完全不一样的视角。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1018

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[力扣C语言实现]3.无重复字符的最长子串

3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: s = “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“p

dengwodaer的博客 1313

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode:3. 无重复字符的最长子串

LeetCode:3. 无重复字符的最长子串。 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

Super algorithm 的博客,技术爱好者。 658

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

无重复字符的最长子串 - 力扣(LeetCode)

这里的原因在于,假设我们选择字符串中的第 kkk 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为 rkr_kr。以 abcabc(b)b\texttt{abcabc(b)b}abcabc(b)b 开始的最长字符串为 abcabc(b)b\texttt{abcabc(b)b}abcabc(b)b;以 abcabcb(b)\texttt{abcabcb(b)}abcabcb(b) 开始的最长字符串为 abcabcb(b)\texttt{abcabcb(b)}abcabcb(b)。

lei7143的专栏 735

Leetcode 3. 无重复字符的最长子串

否则有时候做题容易混淆。双指针移动一般分为两种,同向和反向,即快慢指针遍历方向相同还是相反。

安迪的平行世界 647
上一篇: InstructGPT论文解读
下一篇: 最长回文子串
sunghosts
博客等级 码龄16年 58粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值