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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章