回文字符串

2024-06-28 14:28:36 93
编写一个函数,检查输入的字符串是否是回文字符串(即正反都一样的字符串)。

编写一个检查字符串是否是回文的函数有多种实现方式。下面提供三种方法:使用循环、使用双指针以及使用递归。

方法一:使用循环

这种方法通过遍历字符串的一半来检查对应的字符是否相同。

代码

function isPalindrome(str) {
    const len = str.length;
    for (let i = 0; i < len / 2; i++) {
        if (str[i] !== str[len - 1 - i]) {
            return false;
        }
    }
    return true;
}

解释

  1. 获取字符串的长度 len
  2. 遍历字符串的一半,检查字符 str[i]str[len - 1 - i] 是否相等。
  3. 如果找到不相等的字符,返回 false
  4. 如果遍历完成没有找到不相等的字符,返回 true

时间复杂度:O(n),其中 n 是字符串的长度,因为我们需要遍历字符串的一半。

空间复杂度:O(1),因为我们只使用了常数级别的额外空间。

方法二:使用双指针

这种方法使用两个指针,一个指向字符串的开头,一个指向字符串的末尾,同时向中间移动。

代码

function isPalindrome(str) {
    let left = 0;
    let right = str.length - 1;

    while (left < right) {
        if (str[left] !== str[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

解释

  1. 初始化两个指针,left 指向字符串的开头,right 指向字符串的末尾。
  2. left 小于 right 时,检查 str[left]str[right] 是否相等。
  3. 如果不相等,返回 false
  4. 如果相等,left 向右移动,right 向左移动。
  5. 如果遍历完成没有找到不相等的字符,返回 true

时间复杂度:O(n),因为我们需要遍历整个字符串。

空间复杂度:O(1),因为我们只使用了常数级别的额外空间。

方法三:使用递归

这种方法通过递归来检查字符串的第一个字符和最后一个字符是否相等,然后递归地检查剩余的字符串。

代码

function isPalindrome(str) {
    if (str.length <= 1) {
        return true;
    }
    if (str[0] !== str[str.length - 1]) {
        return false;
    }
    return isPalindrome(str.slice(1, str.length - 1));
}

解释

  1. 如果字符串长度小于等于1,返回 true
  2. 检查字符串的第一个字符 str[0] 和最后一个字符 str[str.length - 1] 是否相等。
  3. 如果不相等,返回 false
  4. 如果相等,递归地检查去掉第一个和最后一个字符的子字符串。

时间复杂度:O(n),因为每次递归调用处理的字符串长度减少2。

空间复杂度:O(n),因为递归调用的栈空间。

总结

以上三种方法都可以有效地检查字符串是否是回文字符串:

  • 使用循环的方法简单直接,适用于大多数情况。
  • 使用双指针的方法在逻辑上更清晰,适合处理长字符串。
  • 使用递归的方法更具有递归思想,但对于长字符串可能会导致栈溢出。