leetcode-125. 验证回文串刷题小结(c++)

写在前面

  • 难度:简单
    • 常规题目,细节逻辑
    • 常见ASCII码大小:0~9<A~Z<a~z
    • 常见ASCII码:0~9: [48, 57], A-Z: [65, 90], a-z: [97, 122]

题目详情

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

	输入: "A man, a plan, a canal: Panama"
	输出: true
示例 2:

	输入: "race a car"
	输出: false
示例 3:

	输入: "0P"
	输出: false

ac代码

  • 常规解题
    • 字符串转全小写
    • 遍历循环判断
  • transform + tolower + 迭代循环
class Solution
{
public:
    bool isPalindrome(string s)
    {
        transform(s.begin(),s.end(),s.begin(),::tolower);
        int l = 0, r = s.length() - 1;
        while(l < r)
        {
            if(!((s[l] <= 'z'&& s[l] >= 'a') || (s[l] <= '9' && s[l]>= '0')))
                ++l;
            else if(!((s[r] <= 'z'&& s[r] >= 'a') || (s[r] <= '9' && s[r]>= '0')))
                --r;
            else if(s[l] != s[r])
                return false;
            else
            {
                ++l;
                --r;
            }
        }
        return true;
    }
};
  • transform + tolower + isalnum
class Solution
{
public:
    bool isPalindrome(string s)
    {
        transform(s.begin(),s.end(),s.begin(),::tolower);
        int l = 0, r = s.length() - 1;
        while(l < r)
        {
            if(!isalnum(s[l]))
                ++l;
            else if(!isalnum(s[r]))
                --r;
            else if(s[l] != s[r])
                return false;
            else
            {
                ++l;
                --r;
            }
        }
        return true;
    }
};
  • 错误思路
    • 数字或字符相减差值32
    • 特例,“0P”
  • 错误代码
class Solution
{
public:
    bool chk(char a)
    {
        return ((a >= 'a') && (a <= 'z')) ||
               ((a >= 'A') && (a <= 'Z')) ||
               ((a >= '0') && (a <= '9')) ;
    }
    bool isPalindrome(string s)
    {
        int n = s.size();
        if (n == 1)
            return true;
        int i = 0, j = n - 1;
        while (i <= j)
        {
            while ((i <= j) && (!chk(s[i])))
                i++;
            while ((j >= i) && (!chk(s[j])))
                j--;
            if ((i <= j) && (s[i] != s[j]) && (s[i] != s[j] + 32) && (s[j] != s[i] + 32))
                return false;
            i++;
            j--;
        }
        return true;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章