📜  是回文 - C++ (1)

📅  最后修改于: 2023-12-03 15:10:30.070000             🧑  作者: Mango

是回文 - C++

回文是指正着读和倒着读都一样的字符串,例如 "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;
}
总结

本文介绍了两种判断字符串是否是回文的方法,分别是双指针法和递归法。其中双指针法时间复杂度较优,递归法可以看作是纯粹的算法实现,实际应用时需要使用双指针法。