📅  最后修改于: 2023-12-03 15:10:30.070000             🧑  作者: Mango
回文是指正着读和倒着读都一样的字符串,例如 "racecar"、"level" 等等。本篇介绍如何用 C++ 判断一个字符串是否是回文。
判断一个字符串是否是回文有多种方法,这里介绍两种:
双指针法是比较直观的方法,即设定两个指针从字符串的开头和结尾同时向中间移动,每次比较两个指针指向的字符是否相等。如果存在不相等的字符,则该字符串不是回文。
bool isPalindrome(string s) {
int left = 0, right = s.length() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
++left;
--right;
}
return true;
}
时间复杂度:$O(n)$,其中 $n$ 是字符串的长度。
空间复杂度:$O(1)$。
递归法是通过递归函数判断字符串是否回文,具体做法是递归的判断一个字符串的首尾字符是否相等,如果相等,则递归判断去掉首尾字符的字符串是否回文,直到字符串长度小于等于1。
bool isPalindrome(string s) {
int n = s.length();
if (n <= 1) {
return true;
}
return s[0] == s[n - 1] && isPalindrome(s.substr(1, n - 2));
}
时间复杂度:$O(n)$,其中 $n$ 是字符串的长度。
空间复杂度:$O(n)$。
#include <iostream>
using namespace std;
bool isPalindrome(string s) {
int left = 0, right = s.length() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
++left;
--right;
}
return true;
}
int main() {
string s;
cin >> s;
if (isPalindrome(s)) {
cout << "是回文" << endl;
} else {
cout << "不是回文" << endl;
}
return 0;
}
本文介绍了两种判断字符串是否是回文的方法,分别是双指针法和递归法。其中双指针法时间复杂度较优,递归法可以看作是纯粹的算法实现,实际应用时需要使用双指针法。