无重复字符的最长子串
题目来源: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
动态规划解法: