自学内容网 自学内容网

【C++】125 验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

#include <iostream>
#include <cctype>
using namespace std;

bool isPalindrome(string s) {
    // 将字符串中的大写字母转换为小写字母
    for (char &c : s) {
        if (isupper(c)) {
            c = tolower(c);
        }
    }

    // 移除所有非字母数字字符
    string filteredStr = "";
    for (char c : s) {
        if (isalnum(c)) {
            filteredStr += c;
        }
    }

    // 检查短语是否为回文串
    int left = 0, right = filteredStr.length() - 1;
    while (left < right) {
        if (filteredStr[left] != filteredStr[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

int main() {
    string s = "A man, a plan, a canal: Panama";
    if (isPalindrome(s)) {
        cout << "True" << endl;
    } else {
        cout << "False" << endl;
    }
    return 0;
}

时间复杂度分析:

大写字母转换为小写字母的循环遍历时间复杂度为 O(n),其中 n 为字符串 s 的长度。
移除非字母数字字符的循环遍历时间复杂度同样为 O(n)。
检查回文串的过程中,使用了双指针法,时间复杂度为 O(n/2),即 O(n)。
总体来说,这段代码的时间复杂度为 O(n)。

空间复杂度分析:

新建了一个字符串 filteredStr 用于存储移除非字母数字字符后的字符串,其长度最多为原字符串 s 的长度,因此空间复杂度为 O(n)。
除此之外,没有使用额外的数据结构,因此其他空间占用可以忽略不计。
总体来说,这段代码的空间复杂度为 O(n)。
综上所述,该代码的时间复杂度为 O(n),空间复杂度也为 O(n)。

tips:
isalnum() 是 C++ 中的一个函数,用于判断一个字符是否为字母或数字字符。函数的原型如下:

int isalnum(int c);

它接受一个字符作为参数,并返回一个非零值(通常为1),如果该字符是一个字母(即 A-Z 或 a-z)或数字(即 0-9),否则返回0。

这个函数通常用于字符分类,用于过滤字符串中的非字母数字字符。


原文地址:https://blog.csdn.net/ZSZ_shsf/article/details/137693989

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!