js获取字符串中无重复字符的最长子字符串长度

前言

字符串内字符位置是固定的,我们要用顺序循环的方式把字符串分割,每个分割的小字符串内不能出现重复的字符,也就是说分割的小字符串中的每个字符都是唯一不重复的。当该段分割的下一个字符与该段分割内有相同的字符,当即重新开始分割字符。

代码

获取字符串中无重复字符的最长子字符串长度

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, 感谢阅读!欢迎评论区留言讨论~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容