• leetCode 125. 验证回文串 + 双指针


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


    示例 1:

    输入: s = "A man, a plan, a canal: Panama"
    输出:true
    解释:"amanaplanacanalpanama" 是回文串。
    

    示例 2:

    输入:s = "race a car"
    输出:false
    解释:"raceacar" 不是回文串。
    

    示例 3:

    输入:s = " "
    输出:true
    解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
    由于空字符串正着反着读都一样,所以是回文串。

    一、双指针法 

    1. bool isAlphaDigit(char& c){
    2. if('a' <=c && c<='z') return true;
    3. if ('A' <= c && c <= 'Z') {
    4. c += ('a' - 'A');
    5. return true;
    6. }
    7. if ('0' <= c && c <= '9') {
    8. return true;
    9. }
    10. return false;
    11. }

    可以用自己封装的isAlphaDigit函数,也可以用C++已有的isalnum这个函数 

    力扣官方解法:

    1. class Solution {
    2. public:
    3. bool isPalindrome(string s) {
    4. if(s.empty()) return true;
    5. int left=0,right = s.size()-1;
    6. while(left < right) {
    7. while(leftisalnum(s[left])) ++left;
    8. while(leftisalnum(s[right])) --right;
    9. if (left < right) {
    10. if (tolower(s[left]) != tolower(s[right])) {
    11. return false;
    12. }
    13. ++left;
    14. --right;
    15. }
    16. }
    17. return true;
    18. }
    19. };
    • 时间复杂度:O(∣s∣),其中 ∣s∣是字符串 s 的长度。

    • 空间复杂度:O(1)

    我的解法:

    1. class Solution {
    2. public:
    3. bool isPalindrome(string s) {
    4. if(s.empty()) return true;
    5. int left=0,right = s.size()-1;
    6. while(left < right) {
    7. if(!isalnum(s[left])) {++left; continue;}
    8. if(!isalnum(s[right])) {--right;continue;}
    9. if (tolower(s[left]) != tolower(s[right])) {
    10. return false;
    11. }
    12. ++left;
    13. --right;
    14. }
    15. return true;
    16. }
    17. };
    • 时间复杂度:O(∣s∣),其中 ∣s∣是字符串 s 的长度。

    • 空间复杂度:O(1)

    用regex库,正则化,不过效率不高

    1. class Solution {
    2. public:
    3. bool isPalindrome(string s) {
    4. if(s.empty()) return true;
    5. regex rule_match("[^a-zA-Z\\d]");
    6. string str = regex_replace(s, rule_match, "");
    7. int left=0,right = str.size()-1;
    8. while(left < right) {
    9. if (tolower(str[left]) != tolower(str[right])) {
    10. return false;
    11. }
    12. ++left;
    13. --right;
    14. }
    15. return true;
    16. }
    17. };
  • 相关阅读:
    20230911 CLion 中 commit 窗口悬浮之后,再dock到主窗口
    [附源码]计算机毕业设计springboot基于JAVA技术的旅游信息交互系统
    Springboot构建多模块项目
    K_A07_002 基于 STM32等单片机驱动ULN2003模块按键控制步进电机正反转
    JAVA将List转成Tree树形结构数据和深度优先遍历
    C#的File 类使用说明
    RabbitMQ工作模式——Routing路由模式
    MongoDB-安全认证 (7)
    Linux服务器的一些优点
    Docker Compose V2 安装常用数据库MySQL+Mongo
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/133934025