美文网首页
编程算法 - 返回所有最长无重复连续子串(js)

编程算法 - 返回所有最长无重复连续子串(js)

作者: One_Hund | 来源:发表于2018-04-25 00:19 被阅读0次

    题意:返回所有最长无重复连续子串
    例如:
    输入aaa,返回a a a
    输入abc,返回abc
    输入abcad,返回bcad
    输入abccda,返回abc cda
    输入abcabcabc,返回abc bca cab abc bca cab abc

    解题思路:参考思路
    辅助变量:obj对象(初始值:{start:0}),maxStr,nowStr
    复杂度:时间复杂度O(n),空间复杂度O(n)
    思路:
    1. 使用for从头到尾循环遍历字符串每一个字符

    • 若当前字符没有在obj对象里,说明还没有出现重复字符:
      (1)将当前字符加在nowStr尾部;
      (2)在obj对象里添加这个字符,字符值为它的位置

    • 若当前字符出现在obj对象里,说明出现重复字符:
      ‌考虑2种情况:
      1.obj.start指针在重复字符的前一个字符的位置的前面或重叠(如:abcad,obj.start指针初始为0,位置跟第一个a重叠),说明当前字符与当前子串nowStr有重复:
      (1)更新obj.start指针的值,指向重复字符的前一个字符的位置+1(如:abcad,则obj.start的值从0变成obj[a]+1=1);
      (2)将重复字符的位置更新成后一个字符的位置(如:abcad,obj[a]的值从0变成3);
      (3)比较当前子串nowStr与最长子串maxStr的长度,若大于则替换,若等于则加在maxStr末尾,若小于则不管;
      (4)更新当前子串的值为obj.start的位置到当前字符的位置(nowStr=data.substring(obj.start,i+1))
      2.obj.start指针在重复字符的前一个字符的位置的后面(如:abccba,遍历到第二个b时,obj.start指针为3,在第一个b的后面),说明当前字符与当前子串nowStr无重复:
      (1)仅更新重复字符的位置为当前位置;
      (2)将当前字符加在nowStr末尾

    2. for循环便利出来后:
    (1)再比较nowStr与maxStr的长度,若大于则替换,若等于则加在maxStr末尾,若小于则不管;

    3‌. 输出maxStr

    JS代码如下:

    var readline = require('readline');
    process.stdin.setEncoding('utf-8');
    
    var rl = readline.createInterface({input: process.stdin, output: process.stdout, prompt:''});
    rl.prompt();
    
    rl.on('line', function (data) {
        data = data.trim();
        let obj={
            start: 0
        };
        let nowStr='';
        let maxStr='';
        let maxLen=0;
        let len = data.length;
        for(let i=0;i<len;i++){
            let char = data[i];
            if(!(obj[char]>=0)){ // 若不重复
                obj[char]=i;
                nowStr+=char;
            }else{  // 若重复
                if(obj.start<=obj[char]){ // 若start指针在重复字符(重复字符的第一个字符)之前
                    obj.start=obj[char]+1; // 改变start指针位置
                    obj[char]=i; // 改变这个字符的位置
                    if(nowStr.length>maxLen){ // 比较当前子串跟最长子串的长度
                        maxStr=nowStr;  // 若大于,则替换
                        maxLen=nowStr.length;
                        nowStr=data.substring(obj.start,i+1);
                    }else if(nowStr.length===maxLen){ // 若等于,则隔一个空格加在末尾
                        maxStr+=' '+nowStr;
                        nowStr=data.substring(obj.start,i+1);
                    }else{  // 若小于,仅更新nowStr
                        nowStr=data.substring(obj.start,i+1);
                    }
                }else{ // 若start指针在重复字符(重复字符的第一个字符)之后
                    obj[char]=i;  // 改变这个字符的位置
                    nowStr=data.substring(obj.start,i+1);
                }
            }
        }
        if(nowStr.length>maxLen){
            maxStr=nowStr;
            maxLen=nowStr.length;
        }else if(nowStr.length===maxLen){
            maxStr+=' '+nowStr;
        }
        console.log(maxStr)
    });
    

    相关文章

      网友评论

          本文标题:编程算法 - 返回所有最长无重复连续子串(js)

          本文链接:https://www.haomeiwen.com/subject/dzaslftx.html