JS中最长子串求取
2019-12-09 本文已影响0人
陆璐monica
从不确定字符串中获取最长子串。
该字符串可能:
- 包含长度不等但字符相同的子串 例如aabbbbbsssssssaaaaaaaaaajjooo(这个导致下方函数中变量arr[字符]需要重置)
- 字符串中不仅只有a-z中的字符还有其他不确定字符
- 字符串不给定,是可变的
- 可能存在相同长度的子字符串(这个导致还需要另外一个循环来取值)
实现方法
// 这个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);
实现思路:
- 将给定字符串分割成数组strArr
- 循环遍历该数组strArr,每一次循环到相同字符则数量加1,直到下一个字符非本字符串内字符
- 和max进行比较,将比max值大的字符和其长度存储在maxStrArr对象中,并置空arr中该字符的长度(避免下一次出现和该字符相同字符造成长度累加)
- 由于上一个循环中只简略的进行了一次排序,所以需要进行再一次的循环取最大值(这里我们已经获取了字符最长的数量max,后续只要取和max相等的字符,并将其拼接起来)
说明:
这个代码可能还有问题,但是我暂时还没想到,感觉这个是我暂时想到最简短的.......有更好的解决方法的话,欢迎留言告诉我。