前言
大三上学期了,为了拿offer,操练起来了!刷刷刷
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
解题思路
见示例出想法
s = "abcabcbb" :
1. 将不同的字母进行拼接,计算其长度
例:
str = str + s[i] => str = "abc" len = 3
2. 后面的 "a" 在str中重复 然后进行重新定位, 从 "a" 开始。[这里到后面是错的]
例:
abc[X] 从下一个"abc" 开始
3. 对比邻近的两次str 进行判断 获取更长的长度
实践出真知:【下面为错误的代码】
let a = "";
let len = 0;
let c = ""
for(let i = 0; i < s.length; i++){
a = a + s[i];
let index = a.indexOf(c)
if(index != -1){
if(a.length > len){
len = a.length
}
a = ""
}
}
查缺补漏 【某些特殊例子不符合】
例:
"au"
"dvdf"
"au" 在执行到s[3],变成了undefind,未触发 if(index != -1)
所以 len 未改变 为1
补充:
if(typeof s[i+1] == 'undefined') {
c = s[i]
}else {
c = s[i+1]
}
"dvdf" 在str="dv"是 后面的d重复了 所以是str为 str="df" 返回的 len 为 2
但是显然错了 答案为3 str 为 "vdf"
补充
a = a.slice(index+1,a.length)
AC 代码:
let a = "";
let len = 0;
let c = ""
for(let i = 0; i < s.length; i++){
a = a + s[i];
if(typeof s[i+1] == 'undefined') {
c = s[i]
}else {
c = s[i+1]
}
let index = a.indexOf(c)
if(index != -1){
if(a.length > len){
len = a.length
}
a = a.slice(index+1,a.length)
}
return len;
}
总结:
年轻的我 算法贼弱 主要理解算法题的意思 在实现自我的想法时加强对特殊值的判断
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!