返回

JavaScript: 查找字符串的最长公共前缀和后缀

javascript

在 JavaScript 中,我们经常需要处理字符串,其中一个常见的问题就是找到一组字符串的最长公共前缀(Longest Common Prefix,LCP)和最长公共后缀(Longest Common Suffix,LCS)。这个问题看似简单,但在实际应用中却有很多需要注意的细节。

我们先来看如何找到一组字符串的最长公共前缀。假设我们有一组字符串 ["flower", "flow", "flight"],它们的最长公共前缀是 "fl"。我们可以用一个简单的循环来实现这个功能。首先,我们选择数组中的第一个字符串作为初始前缀。然后,我们遍历数组中的其他字符串,将当前前缀与每个字符串进行比较。如果发现某个字符串的前缀与当前前缀不一致,我们就将当前前缀截断到不一致的位置。最后,剩下的前缀就是所有字符串的最长公共前缀。

代码实现如下:

function longestCommonPrefix(strs) {
  if (!strs || strs.length === 0) {
    return "";
  }

  let prefix = strs[0];
  for (let i = 1; i < strs.length; i++) {
    let j = 0;
    while (j < prefix.length && j < strs[i].length && prefix[j] === strs[i][j]) {
      j++;
    }
    prefix = prefix.substring(0, j);
  }
  return prefix;
}

const strings = ["flower", "flow", "flight"];
const prefix = longestCommonPrefix(strings);
console.log(prefix); // 输出 "fl"

这段代码首先判断字符串数组是否为空,如果为空则直接返回空字符串。然后,它将第一个字符串作为初始前缀,并遍历数组中的其他字符串。在内层循环中,它逐个字符地比较前缀和当前字符串,直到找到第一个不匹配的字符,或者其中一个字符串结束。最后,它将前缀截断到不匹配的位置,并继续比较下一个字符串。

接下来,我们来看看如何找到一组字符串的最长公共后缀。我们可以利用一个技巧:将所有字符串反转,然后找到反转字符串的最长公共前缀,最后再将这个前缀反转回来,就得到了原始字符串的最长公共后缀。

代码实现如下:

function longestCommonSuffix(strs) {
  if (!strs || strs.length === 0) {
    return "";
  }

  const reversedStrs = strs.map(str => str.split("").reverse().join(""));
  const reversedPrefix = longestCommonPrefix(reversedStrs);
  return reversedPrefix.split("").reverse().join("");
}

const strings2 = ["flower", "sunflower", "power"];
const suffix = longestCommonSuffix(strings2);
console.log(suffix); // 输出 "wer"

这段代码首先判断字符串数组是否为空,如果为空则直接返回空字符串。然后,它使用 map 方法将每个字符串反转,并将反转后的字符串数组传递给 longestCommonPrefix 函数,得到反转字符串的最长公共前缀。最后,它将这个前缀反转回来,就得到了原始字符串的最长公共后缀。

常见问题解答:

1. 如果字符串数组为空,longestCommonPrefixlongestCommonSuffix 函数会返回什么?

答:如果字符串数组为空,这两个函数都会返回空字符串。

2. longestCommonPrefixlongestCommonSuffix 函数的时间复杂度是多少?

答:这两个函数的时间复杂度都是 O(n*m),其中 n 是字符串数组的长度,m 是字符串的平均长度。

3. 除了上述方法,还有其他方法可以找到最长公共前缀和后缀吗?

答:是的,还有其他方法,比如使用 Trie 树或者分治法。但是,上述方法是最简单易懂的。

4. 这些函数在实际应用中有哪些用途?

答:这些函数在很多领域都有应用,比如字符串匹配、文本编辑、生物信息学等等。

5. 如何处理字符串中包含特殊字符的情况?

答:如果字符串中包含特殊字符,我们需要根据具体情况进行处理。比如,如果特殊字符不影响前缀或后缀的判断,我们可以直接忽略它们。如果特殊字符有特殊的含义,我们需要根据它们的含义进行相应的处理。

希望这篇文章能够帮助你理解如何在 JavaScript 中找到字符串的最长公共前缀和后缀。