返回

HOT100之最长回文子串(JavaScript版)

前端

HOT100——最长回文子串(JS实现)

引言

在计算机科学中,回文子串是指在一个字符串中出现的连续字符序列,它们从左向右读和从右向左读都相同。例如,在字符串“abba”中,“abba”和“bb”都是回文子串。

寻找最长回文子串是一个经典的字符串处理问题,在许多实际应用中都有广泛的使用,例如:文本处理、模式匹配、数据压缩等。本文将详细讲解如何使用JavaScript来寻找一个字符串中的最长回文子串。

解题思路

在解决这个问题时,我们可以采用中心扩散法。中心扩散法的核心思想是:对于一个给定的字符,我们以它为中心向左右两边扩展,同时比较左右两边的字符是否相等。如果它们相等,我们就继续向外扩展,直到找到不相等的字符为止。这样,我们就找到了一个以给定字符为中心的回文子串。

方法:中心扩散法

/**
 * 寻找字符串中的最长回文子串
 * @param {string} str 字符串
 * @return {string} 最长回文子串
 */
function longestPalindrome(str) {
  if (str === null || str.length === 0) {
    return "";
  }

  let start = 0;
  let end = 0;
  let maxLength = 0;

  // 循环遍历字符串
  for (let i = 0; i < str.length; i++) {
    // 考虑奇数长度的回文子串
    let oddLength = expandAroundCenter(str, i, i);
    if (oddLength > maxLength) {
      start = i - Math.floor(oddLength / 2);
      end = i + Math.floor(oddLength / 2);
      maxLength = oddLength;
    }

    // 考虑偶数长度的回文子串
    let evenLength = expandAroundCenter(str, i, i + 1);
    if (evenLength > maxLength) {
      start = i - Math.floor(evenLength / 2) + 1;
      end = i + Math.floor(evenLength / 2);
      maxLength = evenLength;
    }
  }

  // 返回最长回文子串
  return str.substring(start, end + 1);
}

/**
 * 扩展回文子串的中心
 * @param {string} str 字符串
 * @param {number} left 左边界
 * @param {number} right 右边界
 * @return {number} 回文子串的长度
 */
function expandAroundCenter(str, left, right) {
  // 循环扩展回文子串的中心
  while (left >= 0 && right < str.length && str[left] === str[right]) {
    left--;
    right++;
  }

  // 返回回文子串的长度
  return right - left - 1;
}

具体思路请看代码注释。

结束语

在本文中,我们介绍了如何使用JavaScript来寻找一个字符串中的最长回文子串。我们使用中心扩散法来解决这个问题,并提供了详细的代码实现。我们还讨论了两种情况:回文子串的长度是奇数和偶数。希望这篇文章对您有所帮助。