算法描述:给定一个字符串,找到长度最大的无重复字符的子字符串,并输出其长度。
举例:输入字符串"abcabcbb",结果是"abc",length为3
输入字符串"bbbbb",结果是"b",length为1
输入字符串"pwwkew",结果是"wke",length为
第一时间想到的就是用循环来解决,通过两层循环找出所有不重复的组合,然后最后在这些组合里选出length值最大的字符串。
外层循环就是对每一个位置开始的子字符串都进行一次查找,比如输入的字符串是"abcdd",那么我们通过循环比对的字符串分别是:"abcdd","bcdd","cdd","dd","d"。
接下来我们就要对第一层循环取得的子字符串进行比对,从子字符串的第一位开始,每次向下移一位进行检查,直到遇到重复的字符串 为止,或者到末尾结束。
把所有得到的结果都push到一个数组里,然后对数组遍历找到length值最大的那个。
然后我们来看看代码实现:
var substrings=[];//用来存放所有的结果的数组
var next="";//用来临时存储字符串
var currentSubstring="";//每次外层循环都更新的子字符串
var max=0;//length最大值
然后我们先检查传入字符串的长度,如果传入一个空字符,我们就直接返回0
//s是函数入口传入的参数
if(s.length){
//长度不为0开始处理
}else{
//长度为0则直接返回0
return 0;
}
接下来我们对s进行处理:
for(var i=0;i<s.length;i++){
//利用substr截取每次内层要遍历的字符串,每次都向后移一位,所以直接传入i即可
currentSubstring=s.substr(i);
for(var j=0;j<s.length-i;j++){
//利用indexOf检查next中是否有重复,next初始为空字符串,所以第一个字符串肯定不会重复
if(next.indexOf(currentSubstring[j])===-1){
//如果不重复的话,把它拼接给next字符串,然后继续内层循环
next+=currentSubstring[j];
continue;
}else{
//若某次循环发现了在next中已经出现了该字符
//那么直接把next push进结果数组substrings,然后跳出内层循环
substrings.push(next);
next="";
break;
}
}
//假如我们传入的字符串只有一位,那么内层循环就无法push进数组,所以我们要在外层检查一下
if(next.length!==0){
substrings.push(next);
next="";
}
}
最后我们对存储所有结果的substrings数组遍历查找length最大的成员:
substrings.forEach(function (item) {
if(item.length>=max)max=item.length;
});
return max;
我们也可以直接输出substrings看看结果是怎么样的:
func("pwwkew")
[ 'pw', 'w', 'wke', 'kew', 'ew', 'w' ]
func("")
0
func("a")
[ 'a' ]
然后就大功告成啦!下面贴上完整代码:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
var substrings = [];
var next = "";
var currentSubstring = "";
var max = 0;
if (s.length) {
for (var i = 0; i < s.length; i++) {
currentSubstring = s.substr(i);
for (var j = 0; j < s.length - i; j++) {
if (next.indexOf(currentSubstring[j]) === -1) {
next += currentSubstring[j];
continue;
} else {
substrings.push(next);
next = "";
break;
}
}
if (next.length !== 0) {
substrings.push(next);
next = "";
}
}
substrings.forEach(function (item) {
if (item.length >= max) max = item.length;
});
return max;
} else {
return 0;
}
};