【每日一題】LeetCode. 125. 驗證迴文串

每日一題,防止癡呆 = =

一、題目大意

給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。

說明:本題中,我們將空字符串定義爲有效的迴文串。
在這裏插入圖片描述
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-palindrome

二、題目思路以及AC代碼

這題就是在迴文串的基礎上增加了一些,要對字符串中有效的字符進行迴文串的檢測。

思路一

你完全可以將有效的字符提取出來形成一個新的字符串,再按照原先的方法進行迴文串的判斷,無非就是三種方法:翻轉字符串、棧、雙指針。

思路二

你也可以將原先的三種方法進行改進,從而應用於這種類型的字符串來判斷。比如棧,你可以僅入棧你需要的有效字符而跳過那些不考慮的字符。比如雙指針,你同樣可以在移動指針的時候跳過那些不考慮的字符。關於翻轉的方法,好像沒有類似的變化,你倒是可以翻轉之後跳過不考慮的字符進行對比,但那樣的話時間複雜度可能會高一點。

AC代碼

因爲上面提到的思路都是基本的驗證迴文字符串的思路,代碼就只寫了自己使用的棧的方法。

class Solution {
public:
    bool is_letter_or_num(char c) {
        if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) return true;
        return false;
    }

    bool isPalindrome(string s) {
        stack<char> check;
        int len = s.length();

        if (!len) return true;

        for (int i=0;i<len;i++) {
            if (s[i] >= 'A' && s[i] <= 'Z') s[i] += 32;
            if (is_letter_or_num(s[i])) check.push(s[i]);
        }

        for (int i=0;i<len;i++) {
            if (is_letter_or_num(s[i])) {
                char response = check.top(); check.pop();
                if (response != s[i]) return false;
            }
        }

        return true;
    }
};

如果有問題,歡迎大家指正!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章