125. 验证回文串【 力扣(LeetCode) 】

一、题目描述

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

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

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

二、测试用例

示例 1:

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

示例 2:

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

示例 3:

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

提示:

cpp 复制代码
1 <= s.length <= 2 * 105
s 仅由可打印的 ASCII 字符组成

三、解题思路

  1. 基本思路:
      头指针+尾指针,一直判断是否相等,直到两指针相遇或者字符不相等停止
  2. 具体思路:
    • 预处理:定义 trim(string& s) 函数,功能是删除非字母或数字的字符,并且字符转小写。使用双指针实现,i 指针用于保存字符,j 指针用于遍历,遇到要保持的就赋值给 i 指针,最后删除多余字符。
    • 双指针遍历:先使用 trim 函数处理字符串;因为回文串中心对称,所以我们从两端开始一直判断是否相同。定义头指针 i 和尾指针 j ,初始化为 0n-1 。判断两指针所指字符是否相同,相同就继续判断下一个,i++j-- 。不同则表示不是回文串,返回 false 。直到两指针相遇都相同,则表示是回文串,返回 true

四、参考代码

时间复杂度: O ( n ) \Omicron(n) O(n)

空间复杂度: O ( 1 ) \Omicron(1) O(1)

cpp 复制代码
class Solution {
public:
    void trim(string& s) {
        int n = s.length();
        int i = 0, j = 0;

        while (j < n) {
            s[j] = tolower(s[j]);
            if (isalnum(s[j])) {
                s[i++] = s[j++];
            } else {
                j++;
            }
        }
        s.erase(i, n - i);
    }

    bool isPalindrome(string s) {
        trim(s);
        int n = s.length();
        for (int i = 0, j = n - 1; i < j; i++, j--) {
            if (s[i] != s[j]) {
                return false;
            }
        }

        return true;
    }
};
相关推荐
做时间的朋友。4 分钟前
小华地图寻宝
算法
贾斯汀玛尔斯8 分钟前
每天学一个算法--单调栈(Monotonic Stack)
运维·服务器·算法
ZPC821012 分钟前
ROS2 速度远快于 UDP的完整方案(同机节点)
人工智能·算法·计算机视觉·机器人
khalil102021 分钟前
代码随想录算法训练营Day-34动态规划03 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集
数据结构·c++·算法·leetcode·动态规划·背包问题·01背包
华清远见IT开放实验室23 分钟前
AI 算法核心知识清单(深度实战版2)
人工智能·深度学习·算法·机器学习·ai·模型训练
前进吧-程序员28 分钟前
C++ 内存到底分配在哪?
java·jvm·c++
兩尛1 小时前
c++面试常问1
jvm·c++·面试
点云侠1 小时前
隧道中线提取的优化方法
c++·算法·最小二乘法
汉克老师1 小时前
GESP2023年6月认证C++三级( 第二部分判断题(1-10))
c++·数组·位运算·进制·gesp三级·gesp3级
圣保罗的大教堂1 小时前
leetcode 3761. 镜像对之间最小绝对距离 中等
leetcode