无重复字符的最长子串

846 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
来源:力扣(LeetCode)

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

提示:

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

思路分析

根据题意可知,题目给出一个字符串,里面的字符由英文字母、数字、符号和空格组成,需要我们找出字符串strs中不含重复字符的子字符串,并且要字符最多的、长度最长的子字符串。
要找出长度最长的,那么就需要用到Math.max()方法比较出较大的数值。声明一个变量max存最大值,一个newArray存符合规则的子字符。循环字符串strs,在每次循环中判断每个元素是否在newArray中,若是没有就直接push到newArray中,若是有就要找出在数组中的位置index,然后将数组newArray中的index之前所有元素全部删除,index后面的元素就都留着,再将当前元素strs[i] push到数组newArray里面,每次都需要将前一次的max和当前的newArray的长度作比较,取最大值赋予max;直到循环结束,max就是最长子字符串的长度。

AC代码

function solution(strs) {
    let max = 0;
    let newArray = [];
    for(let i=0; i<strs.length; i++) {
        if(newArray.includes(strs[i])) {
            let index = newArray.indexOf(strs[i]);
            newArray.splice(0, index + 1);
            newArray.push(strs[i]);
        }else{
            newArray.push(strs[i]);
        }
        max = Math.max(max, newArray.length);
    }
    console.log(max);
    return max;
}
let strs = "abcabcbb";
solution(strs)