版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31126175/article/details/84798945
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解答
方法一
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let max = 0;
let n = s.length;
for(let i = 0;i< n;i++){
for(let j=i+1;j<=n;j++){
if(all(s,i,j)){
max = Math.max(max,j-i)
}
}
}
return max;
};
function all(s,start,end){
let set = new Set()
for(let i = start;i<end;i++){
if(set.has(s[i])){
return false;
}else{
set.add(s[i])
}
}
return true;
}
时间复杂度高
方法二
var lengthOfLongestSubstring = function(s) {
let result = '';//最终结果
let temp = ''; //临时变量
for(let i=0; i<s.length; i++){
if(temp.indexOf(s[i]) == -1) { // 当temp中不含有s[i]时
temp += s[i]; // 所有不重复的字符放入temp中
if(temp.length > result.length) { //当temp的长度大于result的长度时 使result=temp
result = temp;
}
} else { // 当temp中含有s[i]时
if(temp.length > result.length) {
result = temp;
}
let index = temp.indexOf(s[i]); //返回temp 重复的位置
temp = temp.slice(index+1) + s[i]; // 当出现重复字符时对temp 重新赋值 从重复的字符之后到结束加上重复的字符 abca -> bca
}
}
return result.length ;
};
再次简化
var lengthOfLongestSubstring = function(s) {
let str="" //存放无重复子串
let size=0 //当前最长无重复子串的长度
for(let i=0,len=s.length;i<len;i++){
let a = s[i];
let index=str.indexOf(a)
if(index==-1){
str+=a
size=Math.max(size,str.length)
}else{
str=str.substr(index+1)+a
}
}
console.log(size);
return size
};