题意:返回所有最长无重复连续子串
例如:
输入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)
});
网友评论