LeetCode 3:无重复字符的最长子串 思考分析

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

示例 1:

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

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

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

动态规划解

dp[i]:到以第i个字符结尾的不包含重复字符的最大长度
对于第i个字符:
1、第i个字符从未出现过,dp[i]=dp[i-1]+1
2、第i个字符出现过:找到第i个字符最近一次出现的位置index(从第i个往前找),记两个距离为d=i-index
【a】、d<= dp[i-1],即这个字符出现在以第i-1个字符结尾的不含重复字符的字符串中,则dp[i]=d,表示从第最近一次出现后重新计算长度:
例如:
i: 0 1 2 3 4 5
s: 1 2 3 4 5 4
dp: 1 2 3 4 5 2
最后的这个2 = 5 - 3(最近一次出现的i);
【b】、d>dp[i-1],即这个字符没有出现在以第i-1字符结尾的不含重复的最大长度字符串中。
dp[i] = dp[i-1] +1;
例如:
i: 0 1 2 3 4 5 6
s: 1 2 3 4 5 4 1
dp: 1 2 3 4 5 2 3
s最后的这个1虽然在i=0的位置出现过,但是由于d=6-0=6>dp[5],所以dp[6]=dp[5]+1,也就是说我们的子串已经重新更新了。

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> myset;int sz = s.size();int ans = 1;if (sz == 0) return 0;vector<int> dp(sz, 0);dp[0] = 1;for (int i = 0;i < sz;i++)       //起点{//如果第i个字符出现过if (myset.find(s[i]) != myset.end()){if (i >= 1){int index = get_index(s, s[i],i);     if (index == -1) index = 0;int d = i - index;if (d <= dp[i - 1]) dp[i] = d;else dp[i] = dp[i - 1] + 1;}}//如果没有出现过,记录下来else{myset.insert(s[i]);if (i >= 1){dp[i] = dp[i - 1] + 1;}}ans = max(ans, dp[i]);}return ans;}int get_index(string s, char x,int start) {int sz = s.size();if (sz == 0) return -1;for (int i = start-1;i >=0 ;i--){if (s[i] == x) return i;}return -1;       //没有找到}
};

在这里插入图片描述
参考https://zhuanlan.zhihu.com/p/112545613进行优化;

f[i]:以原字符串s中,以位置i的字符s[i]为右边界时的最优左边界
例如样例 a b c a b c b b
对应的f数组为:
f[0] = 0,左边界为第一个a,对应子串为a
f[1] = 0,左边界为第一个a,对应子串为ab
f[2] = 0,左边界为第一个a,对应子串为abc
f[3] = 1,左边界为第一个b,对应子串为bca
f[4] = 2,左边界为第一个c,对应子串为cab
f[5] = 3,左边界为第二个a,对应子串为abc
f[6] = 5,左边界为第二个c,对应子串为cb
f[7] = 7,左边界为最后一个b,对应子串为b
f[0] = 0;
对于f[i],只需要考察f[i-1]到i-1这个区间中是否出现过s[i]
如果没有出现过,则f[i]=f[i-1]
如果出现过,那么必然只出现了一次,因为f[i-1]到i-1这个区间中必然不存在重复字符,于是设s[i]出现的位置为pos,则f[i]=pos+1;在重复的字符后面的一个字符作为新的起始点。
可以发现,左边界的更新是单调递增的,因此s中每个字符最多也只会遍历一遍,时间复杂度为O(n)。
由于f[i]的更新只与f[i-1]有关,因此不需要维护整个数组。

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""left = 0res = 0for right,char in enumerate(s):pos = s.find(char,left,right)if pos >=0:left = pos+1else: left = leftres = max(res,right-left+1) return res

在这里插入图片描述

滑动窗口解

其实和dp第一种方法类似:
滑动窗口的核心思路如下:
比如输入字符串为:abcdecfg,字串 abcde 满足题目要求,当新加入 c 时,字串变成了 abcde c,字符 c 重复了,不满足要求。这时候,只需要将第一个重复的字符 c 连同之前的字符丢掉,变成 de c,就又能满足要求了。每新加一个字符,都更新最长字串的长度,遍历完一遍之后,即可得到答案。
问题在于如何丢掉第一个重复字符连同之前的字符,其实我们不用真的丢掉,而是可以维护一个左边界值 left ,有重复字符的话,就把 left 更新为重复字符的下一个位置,假装丢掉了它和之前的字符。
参考链接:https://blog.csdn.net/m0_37433111/article/details/108743399

class Solution {
public:int lengthOfLongestSubstring(string s) {int sz = s.size();if (sz == 0) return 0;int left=0;int maxlen=1;// val存放字符在原字符串的索引unordered_map<char,int> u_map;for (int i = 0;i < sz;i++)       //起点{//如果有重复的字符,左边界更新到重复的字符后面一个if(u_map.find(s[i])!=u_map.end()) left = max(left,u_map[s[i]]+1);//如果没有重复的字符,左边界保持不变也就是left=left,可以省略不写//将s[i]插入、u_map[s[i]] = i;     //如果有重复的,则将坐标更新为靠后的坐标// 更新最长子串的长度maxlen = max(maxlen,i-left+1);}return maxlen;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国人看见的是友情,中国人看见的是忠诚

美国人看见的是友情&#xff0c;中国人看见的是忠诚 这是一个人狗情未了的感人事件。 一个即将死去的人&#xff0c;总有未了的心愿难以割舍&#xff0c;来自美国的凯文麦克莱恩实现了他的临终愿望&#xff0c;而他的最后愿望就是与自己的爱犬见上最后一面。 现年57岁的凯文麦克…

PyCharm安装及配置

一、下载PyCharm和相关工具 qoi8 二、安装PyCharm 先不要运行PyCharm 三、将jar包放到PyCharm安装目录的bin文件夹下 三、找到pycharm64.exe.vmoptions和pycharm.exe.vmoptions配置文件 四、编辑这两个文件&#xff0c;在这两个文件最后一行加入下载好的jar包文件路径 -ja…

LeetCode 239:滑动窗口最大值 思考分析

给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 你能在线性时间复杂度内解决此题吗&#xff1f; 示例: 输入: num…

计算机论文范文1500,电子商务毕业论文范文1500字

电子商务毕业论文范文1500字时间稍纵即逝&#xff0c;充满意义的大学生活即将结束&#xff0c;毕业前要通过最后的毕业论文&#xff0c;毕业论文是一种有计划的检验学生学习成果的形式&#xff0c;那么问题来了&#xff0c;毕业论文应该怎么写&#xff1f;下面是小编为大家整理…

五、规则组织的衍生组织——纬山形组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 纬山形组织图&#xff1a; 观察可知&#xff1a;纬山形组织图下半部分是右斜组织&#xff0c;上半部分是左斜组织。右斜和左斜按照垂直方向进行排列。 该图是一个2上3下2上1下(从最下面一行从左往右观看) 特点&#xff1a;每一…

剑指 Offer 57 - II. 和为s的连续正数序列 思考分析

输入一个正整数 target &#xff0c;输出所有和为 target 的连续正整数序列&#xff08;至少含有两个数&#xff09;。 序列内的数字由小到大排列&#xff0c;不同序列按照首个数字从小到大排列。 示例 1&#xff1a; 输入&#xff1a;target 9 输出&#xff1a;[[2,3,4],[4…

六、规则组织的衍生组织——纬向破斜组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 纬向破斜组织图&#xff1a; 下半部分(从左往右)&#xff1a;&#xff0c;3上2下2上1下&#xff0c;右斜&#xff0c;飞数为1 上半部分(从下往上)&#xff1a;&#xff0c;2上2下1上3下。左斜&#xff0c;飞数为-1 通过分析可…

数据结构与算法2——数组

数组是应用最广泛的数据存储结构。它被植入到大部分编程语言中。大部分数据结构都有最基本的四个操作&#xff1a;插入、删除、查找、修改。对于这四种操作每一种数据结构都有相应的算法。算法和数据结构因此就是非常紧密的相联系的。 1 数组例子 …

LeetCode 167. 两数之和 II - 输入有序数组 思考分析

目录1、暴力&#xff0c;超时2、双指针滑动窗口条件限制 AC3、观看题解&#xff08;吸取他人经验&#xff09;1、二分查找2、双指针3、双指针二分查找给定一个已按照升序排列 的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 …

敏捷开发用户故事系列之七:用户故事与MVC

这是用户故事系列的第七篇。&#xff08;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff0c;之八&#xff0c;之九&#xff09;用户故事和MVC没有关系&#xff0c;因为MVC是实现方法&#xff0c;因此在思考用…

七、规则组织的衍生组织——菱形斜纹组织数学模型的建立

基础概念公式推到可参考该专栏下的前几篇博文。 菱形斜纹组织图&#xff1a; 分析&#xff1a;首先3上2下2上1下&#xff0c;飞数为1&#xff0c;右斜。kw8表示从左下角开始往上数8格为纬峰所在位置&#xff1b;kj8表示从左上角开始往右数8格为经峰所在位置。 这样就将菱形斜…

显卡测试软件毛毛虫,超龙超龙,与众不同,顶流配备,散热一流,3070Ti超龙旗舰版评测...

可能大家都没想到此次显卡荒会持续近一年&#xff0c;还是出现国家级干涉才将这股“歪风”刹住了。而且也仅仅算是刹住了大陆的速度&#xff0c;主要踩死刹车的应该就是黄大厨。他从5月初推出的新核心就采取了出厂即锁算力的做法&#xff0c;但是即便如此&#xff0c;那些看着高…

八、非规则组织分析及其数学模型——平纹变化组织

非规则组织顾名思义&#xff0c;无法通过一个数学模型来描述所有的非规则组织、对于每一个具体的非规则组织而言&#xff0c;其也有一定的规律性可循&#xff0c;即可通过分析每一个具体的非规则组织的组织点运动规律来建立相应的数学模型。 一、平纹变化组织 平纹变化组织即…

怎么看xp计算机是32位还是64位,教你查看XP系统的不同32位还是64位详细的步骤

电脑中使用的不同的版本如果安装一些大型的游戏的时候都是有技巧来实现的&#xff0c;那在XP电脑中想要知道的对于不同的32位还是64位的版本的文件操作的时候新手是怎么知道自己安装的软件的版本呢&#xff0c;今天小编就来跟大家分享一下教你查看XP系统的不同32位还是64位详细…

LeetCode 27.移除元素 思考分析

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

九、非规则组织分析及其数学模型——曲线斜纹组织

曲线斜纹组织图&#xff1a; 因为其形状酷似抛物线&#xff0c;抛物线又是曲线中的一种&#xff0c;故称为曲线斜纹组织。 特点&#xff1a;1&#xff0c;每一根经纱上的组织点运动规律不变 2&#xff0c;飞数是变化的&#xff0c;故也称为变飞数组织 飞数满足的两个条件&…

计算机公式column,函数公式的左膀右臂:ROW、COLUMN函数知多少

一个公式生成乘法口诀表演示的公式中用到了两个函数&#xff1a;ROW和COLUMN&#xff0c;这两个函数的用途非常广泛&#xff0c;可以配合其他函数实现很多功能(尤其是和VLOOKUP函数)&#xff0c;另外和这两个函数相似的还有ROWS和COLUMNS函数&#xff0c;也顺便介绍下。函数说明…

apache2.4.x三种MPM介绍

三种MPM介绍 Apache 2.X 支持插入式并行处理模块&#xff0c;称为多路处理模块&#xff08;MPM&#xff09;。在编译apache时必须选择也只能选择一个MPM&#xff0c;对类UNIX系统&#xff0c;…

LeetCode 15. 三数之和 思考分析(双指针解)

目录初解&#xff1a;未考虑去重二解&#xff1a;未考虑去重位置三解&#xff1a;AC题目&#xff1a;给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且…

十、非规则组织分析及其数学模型——锯齿形斜纹组织

锯齿形斜纹组织图&#xff1a; 分析&#xff1a; 前半齿长度k&#xff0c;表示山谷到山峰的列数&#xff0c;也就是锯齿的宽度&#xff1b; 锯齿飞数s&#xff0c;表示山峰到山峰的行数&#xff0c;也就是锯齿的高度。 起始点相差4格&#xff0c;也就是第一部分整体向上移动…