一、题目
给定一个字符串,请你找出其中不含有重复字符的最长字串的长度。
示例1
输入:"abcabcbb"
输出:3
解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入:"bbbbb"
输出:1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入:"pwwkew"
输出:3
解释:因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
二、解题思路
最开始想到的方法是定义一个空数组,定义数组长度。循环字符串,做以下操作。
- 判断当前字符传是否在数组中。否,直接加入数组后面。是,那么从数组中删除以前那个字符串及以前的元素,再加入数组后面。
- 判断数组长度是否大于之前,是,替换。否,不做操作。
- 循环完毕,返回数组长度。
我们拿示例1来画图举例。大概就是这样
image.png
看完了图解,代码如下。
function maxString(str) {
let strArr = []
let len = 0
for (var i = 0; i < str.length; i++) {
let s = str[i]
let index = strArr.indexOf(s)
console.log(index);
if (index >= 0) {
strArr = strArr.slice(index + 1)
}
strArr.push(s)
if (strArr.length > len) {
len = strArr.length
}
}
return len
}
另外附上最佳答案,思路差不多,他这里使用字符串代替了我的数组
/**
*. @param {string} s
*. @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let substr = '', maxLength = 0;
for (var i = 0; i < s.length; i++) {
let findIndex = substr.indexOf(s[i]);
//这里 ~ 符号代表取相反数再减一,巧妙的用来判断findIndex的值是否为-1
if (~findIndex) {
substr = substr.substring(findIndex + 1);
}
substr += s[i];
if (substr.length > maxLength) {
maxLength = substr.length;
}
}
return maxLength;
};
创作不易,喜欢我的文章点个关注吧。