前言
字符串内字符位置是固定的,我们要用顺序循环的方式把字符串分割,每个分割的小字符串内不能出现重复的字符,也就是说分割的小字符串中的每个字符都是唯一不重复的。当该段分割的下一个字符与该段分割内有相同的字符,当即重新开始分割字符。
代码
获取字符串中无重复字符的最长子字符串长度
function getNorepeatStrMaxLen(str) {
let noRepeatStr = '', //用来存储临时分割的最新一段字符串
size = 1; //无重复字符串的长度
//循环整个字符串
for(let i = 0; i < str.length; i++) {
let index = noRepeatStr.indexOf(str[i]);// 当前字符的在noRepeatStr 的index值
if(noRepeatStr.includes(str[i])) {
// 如果noRepeatStr 中已经有了和当前字符相同的字符,重新对noRepeatStr 赋值
noRepeatStr = noRepeatStr.slice(index + 1) + str[i];
} else {
//如果noRepeatStr 中没有和当前字符相同的字符,则拼接在后面
noRepeatStr += str[i];
// 最大长度重新赋值,如果当前长度大于size,则重新赋值,否则保持原来大小
size = size > noRepeatStr.length ? size : noRepeatStr.length;
}
}
return size;
}
// '12314'的无重复最长子字符串为'2314',长度为4
getNorepeatStrMaxLen('12314') //4
扩展
1、获取字符串中无重复字符的最长子字符串或者之一;
2、获取字符串中无重复字符的最长子字符串的集合。
1、获取字符串中无重复字符的最长子字符串或者之一;
一个字符串中无重复的子字符串最长的可能不止一个,所以可能是惟一的,也可能不是惟一的
代码
以下代码获取的是最长的子字符串中的第一个,例如:'123321'
,getMaxLenNorepeatStr('123321')
的结果为'123'
。
function getMaxLenNorepeatStr(str){
let size = 1, //无重复字符串的长度
boxStr = '', //用来存储临时分割的最新一段字符串
norepeatStr = ''; // 我们要的结果
// 以下逻辑和上面基本相同
for(let i = 0; i < str.length; i++) {
let index = boxStr.indexOf(str[i]);
if(boxStr.includes(str[i])) {
boxStr = boxStr.slice(index + 1) + str[i];
} else {
boxStr = boxStr + str[i];
}
// size 小于 boxStr的长度,再赋值
// 如果size <= boxStr.length,则是获取之一中的最后一个
if(size < boxStr.length) {
size = boxStr.length;
norepeatStr = boxStr;
}
}
return norepeatStr;
}
getMaxLenNorepeatStr('123142') // '2314'
2、获取字符串中无重复字符的最长子字符串的集合
把最长的子字符串放到数组里,前面逻辑基本相同,只不过把存储的字符串转化为了数组。
代码
function getMaxLenNorepeatArr(str) {
let size = 1, norepeatArr = [], boxStr = '';
for(let i = 0; i < str.length; i++) {
let index = boxStr.indexOf(str[i]);
if(boxStr.includes(str[i])) {
boxStr = boxStr.slice(index + 1) + str[i];
} else {
boxStr += str[i];
}
if(size <= boxStr.length) {
size = boxStr.length;
if(!norepeatArr.length) {
norepeatArr.push(boxStr);
}
if(norepeatArr[0].length < size) {
norepeatArr = [boxStr];
} else if(norepeatArr[0].length == size) {
norepeatArr.push(boxStr);
}
}
}
// 没有去重,如果需要去重可以这么写
/*return Array.from(new Set(norepeatArr))*/
// 或者这么写
/*return [...new Set(norepeatArr)]*/
return norepeatArr;
}
getMaxLenNorepeatArr('123142'); // ["2314", "3142"]
END, 感谢阅读!欢迎评论区留言讨论~