js截取字符串最长子串的算法
在JavaScript中,要到一个字符串中的最长子串,我们首先需要明确“最长子串”的定义。如果我们是在寻没有重复字符的最长子串,那么我们可以使用滑动窗口算法。
滑动窗口算法的基本思想是维护一个窗口,该窗口在字符串上滑动,同时更新最长子串的长度和起始位置。当窗口中的字符不重复时,我们尝试扩大窗口;当窗口中的字符重复时,我们缩小窗口。
以下是一个实现这个算法的JavaScript函数:
javascript
function longestSubstring(s) {
let maxLength = 0;
let left = 0;
let set = new Set(); js验证字符串长度
for (let right = 0; right < s.length; right++) {
while (set.has(s.charAt(right))) {
set.delete(s.charAt(left));
left++;
}
set.add(s.charAt(right));
maxLength = Math.max(maxLength, right - left + 1);
}
return s.substr(left - maxLength, maxLength);
}
但是,这个函数有一个问题,它在结束时返回的字符串可能是错误的。因为在循环结束时,left指针可能已经移动到最长子串的右侧。我们需要记录最长子串的开始位置和长度,而不是仅仅更新left和maxLength。
修正后的函数如下:
javascript
function longestSubstring(s) {
let maxLength = 0;
let start = 0;
let set = new Set();
let left = 0;
for (let right = 0; right < s.length; right++) {
while (set.has(s.charAt(right))) {
set.delete(s.charAt(left));
left++;
}
set.add(s.charAt(right));
if (right - left + 1 > maxLength) {
maxLength = right - left + 1;
start = left;
}
}
return s.substr(start, maxLength);
}
这个函数会正确地返回没有重复字符的最长子串。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论