LeetCode 125. Valid Palindrome

博客围绕LeetCode上判断字符串是否为回文串的题目展开。介绍使用双指针法解题,一个指针从前往后,一个从后往前,遇到不符合条件字符跳过。还提及判断字符是否为数字或字母可用isalnum库函数,以及while循环中要加begin < end条件避免溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

Input: "A man, a plan, a canal: Panama"
Output: true

Example 2:

Input: "race a car"
Output: false

2022.12.14 Java

呃……以前太菜了的时候写的不知道为啥想那么复杂……就是简单的双指针挪就完事了。

class Solution {
    public boolean isPalindrome(String s) {
        String s1 = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
        int i = 0;
        int j = s1.length() - 1;
        while (i < j) {
            if (s1.charAt(i) == s1.charAt(j)) {
                i++;
                j--;
            } else {
                return false;
            }
        }
        return true;
    }
}

下面的别看了吧。

这道题,Emmm,是有点水了点……实话实说刚开始我真的没有看出来"A man, a plan, a canal: Panama"这句话是回文序列,怀疑人生的我还去专门谷歌了一下确认了palindrome是回文序列,后来才意识到原来这道题是不算空格和非字母数字的字符的,真的很简单。只需要两个指针,一个从前往后,一个从后往前,遇到不符合条件的就跳过继续,遇到不相等的就直接return false。但是这其中还是有挺多细节要注意的:

1. 判断是否是数字或字母有一个好用的库函数叫做isalnum,它的返回值是个int,非零代表true,零代表false。

2. 在用while循环判断当前字符是否符合要求时,还应该加上begin < end的条件,因为有可能在靠近中间的地方你的begin加的太多了超过了end。写到这里我思考了一下,怎么想都没想通什么情况下begin会超过end并且出错,只好忍痛submit一次删掉以后的代码增加一次没有通过的提交,发现测试用例是".,",如果不在begin++的时候作出限制就会出现s[begin] overflow的情况。

代码如下,时间8ms,95.47%,空间9.6M,13.17%:

/*
 * @lc app=leetcode id=125 lang=cpp
 *
 * [125] Valid Palindrome
 */
class Solution {
public:
    bool isPalindrome(string s) {
        int begin = 0;
        int end = s.length() - 1;

        while (begin < end) {
            while (!isalnum(s[begin]) && begin < end) {
                begin++;
            }
            while (!isalnum(s[end]) && begin < end) {
                end--;
            }
            
            if (toupper(s[begin]) != toupper(s[end])) {
                return false;
            }

            begin++;
            end--;
        }
        return true;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值