JS算法——Longest Substring Without Repeating Characters

算法描述:给定一个字符串,找到长度最大的无重复字符的子字符串,并输出其长度。

举例:输入字符串"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;
    }
};

 

转载于:https://my.oschina.net/JSBreaker/blog/843114

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值