首页 > 其他分享 >leetcode 面试经典 150 题:验证回文串

leetcode 面试经典 150 题:验证回文串

时间:2024-12-10 09:28:07浏览次数:7  
标签:150 right isalnum 字符 字母 回文 leetcode left

链接验证回文串
题序号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 <= s.length <= 2 * 105
    • s 仅由可打印的 ASCII 字符组成

解题

双指针法

  1. 核心点:忽略大小写、忽略非字母数字字符;
  2. 时间复杂度:O(n);
  3. 空间复杂度:O(1);
  4. c++ 判断字符串是否只包含字母和数字函数:isalnum()
  5. c++ 字符串比较函数:tolower()
  6. c++实现算法:
class Solution {
public:
    bool isPalindrome(string s) {
        int left = 0, right = s.size() - 1;
        
        while (left < right) {
            // 跳过非字母和数字字符
            if (!isalnum(s[left])) {
                left++;
                continue;
            }
            if (!isalnum(s[right])) {
                right--;
                continue;
            }
            
            // 比较字符(忽略大小写)
            if (tolower(s[left]) != tolower(s[right])) {
                return false;
            }
            
            // 移动指针
            left++;
            right--;
        }
        
        return true;
    }
};
  1. 演示:以示例2为例
    在这里插入图片描述

完整 c++ demo

#include <iostream>
#include <string>
#include <cctype> // 用于isalnum()
using namespace std;

class Solution {
public:
    bool isPalindrome(string s) {
        int left = 0, right = s.size() - 1;
        
        while (left < right) {
            // 跳过非字母和数字字符
            if (!isalnum(s[left])) {
                left++;
                continue;
            }
            if (!isalnum(s[right])) {
                right--;
                continue;
            } 
            // 比较字符(忽略大小写)
            if (tolower(s[left]) != tolower(s[right])) {
                return false;
            }
            
            // 移动指针
            left++;
            right--;
        }
        
        return true;
    }
};

int main() {
    Solution sol;
    
    // 测试1
    string test1 = "A man, a plan, a canal: Panama";
    cout << "Test 1: " << test1 << endl;
    cout << "Is palindrome? " << (sol.isPalindrome(test1) ? "Yes" : "No") << endl;
    
    // 测试2
    string test2 = "race a car";
    cout << "Test 2: " << test2 << endl;
    cout << "test2 size: " << test2.size() << endl;
    cout << "Is palindrome? " << (sol.isPalindrome(test2) ? "Yes" : "No") << endl;
    
    // 测试3
    string test3 = " ";
    cout << "Test 3: " << test3 << endl;
    cout << "Is palindrome? " << (sol.isPalindrome(test3) ? "Yes" : "No") << endl;
    
    // 测试4
    string test4 = "ab_a";
    cout << "Test 4: " << test4 << endl;
    cout << "Is palindrome? " << (sol.isPalindrome(test4) ? "Yes" : "No") << endl;
    
    return 0;
}

标签:150,right,isalnum,字符,字母,回文,leetcode,left
From: https://blog.csdn.net/yanceyxin/article/details/144359156

相关文章

  • leetcode 258. 各位相加。数学
    258.各位相加给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。其中0≤num≤2^31-1法一:迭代classSolution{public:intaddDigits(intnum){while(num>=10){//判断千万别写成num<10intsum=0;......
  • 记一次现场CEMS配套的北京万维盈创数采仪与中控S7 1500通讯故障处理
    现场除尘设备配置了CEMS,通过北京万维盈创的数采仪使用modbusTCP和中控室1500PLC通讯,岗位人员反映中控计算机上数据异常,表现为数据不变化,有时候跳变到无穷大。经过几天排查处理,基本上解决了,把出现问题的地方列举一下:1.数采仪的IP地址和其中一台工控机的IP地址一致,通过修改工控机I......
  • leetcode 904. 水果成篮
    904.水果成篮说白了就是:找最多包含两种元素的最长子串,返回其长度值得注意的是,当窗口内有三种种类时,左窗口边界是要向右移动到窗口内只剩两种种类,而不是什么先进先出!比如[1,0,1,4,1,4,1,2,3] 法一:unordered_mapclassSolution{public:inttotalFruit(vector<int>&......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • LeetCode题集-5 - 最长回文子串(一)
    题目:给你一个字符串 s,找到 s 中最长的回文子串。这一题作为中等难度,常规解法对于大多数人应该都没有难度。但是其中也有超难的解决办法,下面我们就一起由易到难,循序渐进地来解这道题。01、暴力破解法对于大多数题目来说,在不考虑性能的情况下,暴力破解法常常是最符合人的思维......
  • (leetcode每日一题)有效的括号
    (leetcode每日一题)有效的括号题目要求思路代码总结题目给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左......
  • 代码随想录算法训练营第三十八天|leetcode322. 零钱兑换、leetcode279.完全平方数、le
    1leetcode322.零钱兑换题目链接:322.零钱兑换-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之完全背包,装满背包最少的物品件数是多少?|LeetCode:322.零钱兑换哔哩哔哩bilibili思路:感觉跟之前的方法思路差不多,就是对dp初始化的时候,我开始弄错了,应该初始成无限大,对dp[......
  • LeetCode刷题 -- 哈希表
    目录两数之和题目解析算法原理代码面试题01.02.判定是否互为字符重排题目解析算法原理代码存在重复元素题目解析算法原理代码存在重复元素II题目解析算法原理代码字母异位词分组题目解析算法原理代码两数之和题目链接题目解析算法原理法一:暴力枚举,固定......
  • 【Leetcode Top 100】94. 二叉树的中序遍历
    问题背景给定一个二叉树的根节点rootrootroot,返回它的中序遍历。数据约......
  • 【Leetcode 每日一题】782. 变为棋盘
    问题背景一个n×nn\timesnn×n的二维网络b......