编写一个检查字符串是否是回文的函数有多种实现方式。下面提供三种方法:使用循环、使用双指针以及使用递归。
这种方法通过遍历字符串的一半来检查对应的字符是否相同。
代码:
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;
}
解释:
len
。str[i]
和 str[len - 1 - i]
是否相等。false
。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;
}
解释:
left
指向字符串的开头,right
指向字符串的末尾。left
小于 right
时,检查 str[left]
和 str[right]
是否相等。false
。left
向右移动,right
向左移动。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));
}
解释:
true
。str[0]
和最后一个字符 str[str.length - 1]
是否相等。false
。时间复杂度:O(n),因为每次递归调用处理的字符串长度减少2。
空间复杂度:O(n),因为递归调用的栈空间。
以上三种方法都可以有效地检查字符串是否是回文字符串: