【力扣刷题记3】——《无重复字符的最长子串》

288 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

  1. 无重复字符的最长子串-难度中等

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

 

示例 1:

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

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

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

提示:

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

二、题目和思路分析:

题目是要找到无重复值的最长的连续字符的子串,看起来不是很难,只要双重for循环嵌套即可,和常见的排序循环很类似。

比如abcd每次遍历的内容是这样的:a,ab,abc,abcd

即:如果遍历到的字符如果没有存在于当前字符内,就在当前字符后拼接。

所以最开始我的思路是这样的:

想要找到无重复字符的最长字串,那么就要:对字符串进行分割,取分割结果长度最长的

我们初始一个默认最长字符是ss

然后开始循环遍历字符串,从s[n]开始

当前字符串是否包含s[n+1]的字符,不包含则将s[n+1]并入当前字符串,包含则将当前字符串存起来

这么想着,思路没问题,下面就是代码时间啦!

三、代码:

代码实现如下:

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {

    if(s.length == 1) return 1

    let ss = ''  // 最长子串初始值为空

    for(let j = 0; j < s.length; j++){ // 循环遍历数组

        let s1 = s[j]  // 当前对比子串 以第一位下标开始

        for(let i = j+1; i < s.length; i++){ // 双重循环遍历数组

            let s2 = s[i]  // 数组中的每一项

            if(!s1.includes(s2)){  // 如果当前项不存在于外层字符串内

                s1+=s2  // 当前对比子串 拼接数组的下一项

            }else{

                ss.length < s1.length? ss = s1 : ss // 判断最长子串长度是否小于当前对比的子串,如果小于,则取当前对比子串的值
                break  // 结束
                
            }

            ss.length < s1.length? ss = s1 : ss // 判断最长子串长度是否小于当前对比的子串,如果小于,则取当前对比子串的值

        }

    }

    return ss.length
    
}

四、总结:

这道题虽然写的难度是中等,但是我觉得还是偏简单一点的。没想到反复提交到第6次才通过,还是太过于大意了啊!前几次不通过的原因是因为考虑不周到,比如for循环的结束,以及结束前给ss赋值的操作等。

再次觉得写注释很有用,写注释之后整体的代码逻辑会变得很明了,哪里有问题也能一眼看出来,不至于发现代码没按自己的想法运行而一头雾水。

加油吧!

image.png