深入理解回文与 JavaScript 中的回文判断实现

173 阅读2分钟

在字符串处理的世界里,回文是一个非常有趣的概念。所谓回文,就是指正读和反读都一样的字符串,比如 "上海自来水来自海上"、"aba" 等。在前端开发中,我们经常会遇到与回文相关的问题,今天就来深入探讨一下回文的判断方法以及相关扩展。

什么是回文?

回文是一种特殊的字符串结构,它的特点是从左到右读和从右到左读是完全相同的。例如:

  • 简单回文:"aba"、"aaa"

  • 中文回文:"上海自来水来自海上"

  • 较长回文:"wwyyesseyyww"

基础回文判断实现

判断一个字符串是否为回文,最直观的思路有两种:

方法一:反转字符串对比

这种方法非常简单直接,将字符串反转后与原字符串进行比较,如果相同则为回文:

const str = 'juejin'

const newStr = str.split('').reverse().join('')

console.log(newStr); // 输出 "nijuej"

console.log(newStr === str); // 判断是否为回文

方法二:双指针法

通过左右两个指针向中间移动并对比字符的方式判断,这种方法更高效,不需要额外创建反转字符串:

function isPalindrome(s) {
    let l = 0;
    let r = s.length - 1;
    while (l < r) {
        if (s[l] !== s[r]) {
            return false;
        }
        l++;
        r--;
    }
    return true;
}

console.log(isPalindrome('yessey')); // 输出 true​
console.log(isPalindrome('hello')); // 输出 false

进阶:最多删除一个字符的回文判断

有时候我们会遇到更复杂的情况,比如允许最多删除一个字符后判断是否能成为回文。这时候就需要对基础方法进行扩展:

var validPalindrome = function (s) {
  const len = s.length
  let i = 0
  let j = len - 1

  while (i < j) {
    if (s[i] == s[j]) {
      i++
      j--
    } else {
      if (isPalindrome(i + 1, j)) {
        return true
      }
      if (isPalindrome(i, j - 1)) {
        return true
      }

      return false
    }
  }

  function isPalindrome(l, r) {
    while (l < r) {
      if (s[l] == s[r]) {
        l++
        r--
      } else {
        return false
      }
    }
    return true
  }

  return true
};

字符串操作的其他常用方法

在处理回文问题时,我们还会用到很多字符串操作方法,比如:

let str = 'hello world';

console.log(str.length); // 获取长度

console.log(str[1]); // 获取指定位置字符

console.log(str + ' hi'); // 字符串拼接

// 字符串分割与拼接

let arr = str.split(' ');//str 按照空格进行分割,并将分割后的结果存储在数组 arr 中

arr.splice(1, 0, '橘宝');

console.log(arr.join(' ')); // 输出 "hello 橘宝 world"

总结

回文判断是字符串处理中的经典问题,从简单的反转对比到复杂的双指针判断,每种方法都有其适用场景。掌握这些基础方法不仅能解决实际问题,还能帮助我们理解字符串操作的核心思想。

在实际开发中,我们需要根据具体需求选择合适的方法,比如追求简洁可以选择反转对比法,追求性能则可以选择双指针法。对于更复杂的场景,如允许删除字符的情况,也可以基于基础方法进行扩展实现。