返回

多维度拆解 LeetCode《初级算法》字符串之验证回文串 -- JavaScript

前端

LeetCode《初级算法》字符串之验证回文串

LeetCode 是一个备受程序员青睐的在线算法学习平台,其《初级算法》系列包含了大量经典且具有挑战性的算法问题。本文将聚焦于其中一道字符串处理相关的题目 —— 验证回文串,并使用 JavaScript 语言提供详细的解题思路和代码实现。

1. 问题

给定一个字符串,请判断其是否为回文串。回文串是指从左到右读和从右到左读都是一样的字符串,例如 "racecar" 和 "madam" 都是回文串。

2. 解题思路

验证回文串的经典解法是利用字符串的特性,从两端向中间遍历比较字符是否相同。如果字符串的长度为奇数,则中间的字符可以忽略不计;如果字符串的长度为偶数,则中间的两个字符都需要比较。

为了提高算法的效率,我们可以将字符串转换为小写并忽略所有非字母数字的字符。这样可以减少字符串的长度,并避免不必要的比较。

3. JavaScript 代码实现

/**
 * 判断一个字符串是否为回文串
 *
 * @param {string} str 输入的字符串
 * @returns {boolean} 是否为回文串
 */
const isPalindrome = (str) => {
  // 将字符串转换为小写并忽略所有非字母数字的字符
  const cleanedStr = str.toLowerCase().replace(/[^a-zA-Z0-9]/g, '');

  // 如果字符串为空或长度为 1,则它是回文串
  if (cleanedStr === '' || cleanedStr.length === 1) {
    return true;
  }

  // 从两端向中间遍历比较字符
  for (let i = 0, j = cleanedStr.length - 1; i < j; i++, j--) {
    if (cleanedStr[i] !== cleanedStr[j]) {
      return false;
    }
  }

  // 如果遍历完成,则字符串是回文串
  return true;
};

4. 示例

console.log(isPalindrome('racecar')); // true
console.log(isPalindrome('madam')); // true
console.log(isPalindrome('hello')); // false
console.log(isPalindrome('A man, a plan, a canal, Panama!')); // true

5. 复杂度分析

本算法的时间复杂度为 O(n),其中 n 为字符串的长度。这是因为我们在字符串上进行两次遍历,每次遍历都需要访问字符串中的每个字符。空间复杂度为 O(1),因为我们没有使用额外的空间来存储数据。

6. 结语

LeetCode《初级算法》字符串之验证回文串问题是一道经典的字符串处理问题。我们通过将字符串转换为小写并忽略所有非字母数字的字符,然后从两端向中间遍历比较字符,从而实现了该问题的解决。

希望本文对您理解回文串的概念及其在编程中的应用有所帮助。如果您有兴趣了解更多 LeetCode 算法题目的解题思路和代码实现,欢迎访问 LeetCode 官方网站或其他相关资源。