61 有效回文串(Valid Palindrome)

1 题目

题目:有效回文串(Valid Palindrome)
描述:给定一个字符串,判断其是否为一个回文串。只考虑字母和数字,忽略大小写。

lintcode题号——415,难度——medium

样例1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释: "amanaplanacanalpanama"

样例2:

输入: "race a car"
输出: false
解释: "raceacar"

2 解决方案

2.1 思路

  使用两个指针,分别从头尾对向而行,逐个字符判断是否相同即可,注意题中要求跳过非字母和数字的字符,忽略大小写可以通过将字符都转成小写再比较。

2.2 时间复杂度

  时间复杂度为O(n)。

2.3 空间复杂度

  空间复杂度为O(1)。

3 源码

细节:

  1. 使用对向双指针法判断回文串。
  2. 判断条件为left < right即可,不需要判断left == right的情况。
  3. 判断字母和数字可以使用isalnum()函数,字符转小写可以使用tolower()函数。

C++版本:

/**
* @param s: A string
* @return: Whether the string is a valid palindrome
*/
bool isPalindrome(string &s) {
    // write your code here
    if (s.empty())
    {
        return true;
    }

    int left = 0;
    int right = s.size() - 1;
    while (left < right)
    {
        if (!isalnum(s.at(left)))
        {
            left++;
            continue; // 跳过非字母和数字的字符
        }
        //while (left < right && !isalnum(s.at(left))) // 也可以使用while跳过字符
        //{
        //    left++;
        //}
        if (!isalnum(s.at(right)))
        {
            right--;
            continue; // 跳过非字母和数字的字符
        }
        //while (left < right && !isalnum(s.at(right))) // 也可以使用while跳过字符
        //{
        //    right--;
        //}
        if (tolower(s.at(left)) != tolower(s.at(right))) // 都转成小写进行比较
        {
            return false;
        }

        left++;
        right--;
    }

    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值