
本文旨在提供一种在 JavaScript 字符串中查找最长连续特定字符序列(例如 _)的起始和结束索引以及长度的有效方法。我们将分析一种常见的错误实现,并提供一个更简洁、高效的解决方案,避免不必要的字符串分割,直接遍历字符串,从而更准确地确定最长序列的位置。
问题分析
在处理字符串时,经常需要找到满足特定条件的子串。例如,给定一个字符串,我们需要找出其中最长的连续 _ 序列,并返回其长度、起始索引和结束索引。一个常见的误区是先将字符串分割成多个子串,然后进行比较。这种方法不仅效率较低,而且容易在计算索引时出错。
错误示例及分析
以下是一个尝试解决该问题的错误示例:
var widestPasture = function (landscape) {
// Implement your code below
let array = landscape.split("-");
let greatest;
let tillGreatest = 0;
let endIndex;
let answer = [];
for (let i = 0; i < array.length; i++) {
if (array[i + 1] !== undefined) {
greatest = array[i].length;
}
}
for (let i = 0; i < array.length; i++) {
if (array[i].length < greatest) {
tillGreatest += array[i].length;
}
}
let startIndex = tillGreatest += 1;
tillGreatest += 2;
endIndex = tillGreatest + greatest -1;
answer = [greatest, tillGreatest, endIndex];
return answer;
};
console.log(widestPasture("_-___-__-____-______-_"));
// -> [6, 14, 19]
console.log(widestPasture("_-___-__-___-"));
// -> [3, 6, 8] // 错误的结果这个示例存在以下几个问题:
立即学习“Java免费学习笔记(深入)”;
- greatest 变量没有正确地找到最长序列的长度,它只是被赋值为倒数第二个子串的长度,没有进行比较。
- tillGreatest 变量计算了所有长度小于 greatest 的子串长度之和,包括位于最长序列之后的子串,导致起始索引计算错误。
- 使用 split 方法将字符串分割后,计算索引变得复杂,容易出错。
正确的解决方案
一个更有效的方法是直接遍历字符串,记录当前连续 _ 序列的起始索引和长度,并与已知的最长序列进行比较。以下是正确的实现:
var widestPasture = function (landscape) {
let answer = [0, 0, 0];
for (let i = 0, start = 0; i < landscape.length; i++) {
if (landscape[i] != "_") {
start = i + 1;
} else if (i + 1 - start >= answer[0]) {
answer = [i + 1 - start, start, i];
}
}
return answer;
};
console.log(widestPasture("_-___-__-____-______-_"));
// -> [6, 14, 19]
console.log(widestPasture("_-___-__-___-"));
// -> [3, 9, 11]代码解释:
- answer 数组用于存储最长序列的长度、起始索引和结束索引,初始值为 [0, 0, 0]。
- start 变量记录当前连续 _ 序列的起始索引,初始值为 0。
- 循环遍历字符串 landscape。
- 如果当前字符不是 _,则更新 start 变量为下一个字符的索引,表示一个新的序列开始。
- 如果当前字符是 _,则计算当前连续 _ 序列的长度 i + 1 - start。
- 如果当前序列的长度大于等于 answer[0](已知的最长长度),则更新 answer 数组为当前序列的长度、起始索引和结束索引。
- 循环结束后,返回 answer 数组。
总结
通过直接遍历字符串,避免了不必要的字符串分割,简化了索引计算,提高了代码效率和可读性。这种方法可以更准确地找到最长连续特定字符序列的位置。在处理字符串问题时,应该选择最合适的数据结构和算法,以提高代码的效率和可维护性。










