[3. 无重复字符的最长子串] | 刷题打卡

556 阅读2分钟

前言

大三上学期了,为了拿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 春招闯关活动」, 点击查看 活动详情