js做算法题-无重复字符的最长子串 求最长不重复字串,如1231456 => 231456 美团

无重复字符的最长子串
题目来源:LeetCode No.3
题目描述:
无重复字符的最长子串 
给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是"abc",那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b",长度是1。

给定 "pwwkew",最长子串是"wke",长度是3。请注意答案必须是一个子串,"pwke"是 子序列 而不是子串。

思路分析:
对字符串进行遍历,使用String.prototype.indexOf()实时获取遍历过程中的无重复子串并存放于str,并保存当前状态最长无重复子串的长度为res,当遍历结束时,res的值即为无重复字符的最长子串的长度。

解题思路:
滑动窗口思想{个人本身不知道这个词,但解题思路是一样,利用队列思想进行解题}

什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以就要移动这个队列!
如何移动?
只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
时间复杂度:O(n)

JS提供了substr方法可以操作字符串,substr(n)可将字符串从0到n进行截取,刚好符合队列“先进后出”的思想(假定字符串都是通过尾插法连接)
 

代码示例:
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    var res = 0; // 用于存放当前最长无重复子串的长度
    var str = ""; // 用于存放无重复子串
    var len = s.length;
    for(var i = 0; i < len; i++) {
      var char = s.charAt(i);
      var index = str.indexOf(char);
      if(index === -1) {
        str += char;
        res = res < str.length ? str.length : res;
      } else {
        str = str.substr(index + 1) + char;
      }
    }
    return res; 
};

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let len = s.length;

    let list = [];
    let max = 0;
    // 滑动窗口 解题 abc 再多一个 就左边的移除
    for (let i = 0; i < s.length; i++) {
        if (list.includes(s[i])) {
            let cur = list.indexOf(s[i]) + 1;
            list = list.slice(cur); // 截取后面的
            list.push(s[i]);
        } else {
            list.push(s[i]);
        }
        max = Math.max(list.length, max);
    }
    return max;
};
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let dp = new Array(s.length).fill(1);
    for(let i = 1; i < s.length; i++) {
        for(let j = i - 1; j >= 0; j--) {
            if(!s.substring(j+1, i+1).includes(s[j])) {
                dp[i]++
            } else {
                break
            }
        }
    }
    return dp.length ==0 ? 0: Math.max(...dp)
};

————————————————
版权声明:本文为CSDN博主「Sojourn2017」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40870788/article/details/80727953

动态规划解法:

力扣

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baoleilei6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值