JS中最长子串求取

2019-12-09  本文已影响0人  陆璐monica

从不确定字符串中获取最长子串。
该字符串可能:

  1. 包含长度不等但字符相同的子串 例如aabbbbbsssssssaaaaaaaaaajjooo(这个导致下方函数中变量arr[字符]需要重置)
  2. 字符串中不仅只有a-z中的字符还有其他不确定字符
  3. 字符串不给定,是可变的
  4. 可能存在相同长度的子字符串(这个导致还需要另外一个循环来取值)

实现方法

// 这个str是可变的,这里为了方便测试写死了
let str = 'aabbbbbsssssssaaaaaaaaaajjooooooooooooowwwwwwwwwww';
let arr = {}, strArr = [], max = 0;
let maxStrArr = {}, maxChildStr = []
strArr = str.split('');
for (let i = 0, length = strArr.length; i < length; i++) {
    arr[strArr[i]] = arr[strArr[i]] ? arr[strArr[i]] + 1 : 1;
    if (arr[strArr[i]] >= max && (strArr[i] !== strArr[i + 1])) {
        max = arr[strArr[i]];
        maxStrArr[strArr[i]] = max
    }

    strArr[i] !== strArr[i + 1] ? arr[strArr[i]] = 0 : '';

}
for (let i in maxStrArr) {
    if (max === maxStrArr[i]) {
        let maxStr = ''
        while (maxStrArr[i] > 0) {
            maxStr += i;
            maxStrArr[i]--
        }
        maxChildStr.push(maxStr)
    }
}
console.log(maxStrArr, maxChildStr);

实现思路:

  1. 将给定字符串分割成数组strArr
  2. 循环遍历该数组strArr,每一次循环到相同字符则数量加1,直到下一个字符非本字符串内字符
  3. 和max进行比较,将比max值大的字符和其长度存储在maxStrArr对象中,并置空arr中该字符的长度(避免下一次出现和该字符相同字符造成长度累加)
  4. 由于上一个循环中只简略的进行了一次排序,所以需要进行再一次的循环取最大值(这里我们已经获取了字符最长的数量max,后续只要取和max相等的字符,并将其拼接起来)

说明:
这个代码可能还有问题,但是我暂时还没想到,感觉这个是我暂时想到最简短的.......有更好的解决方法的话,欢迎留言告诉我。

上一篇下一篇

猜你喜欢

热点阅读