每日一題,防止癡呆 = =
一、題目大意
給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。
說明:本題中,我們將空字符串定義爲有效的迴文串。
來源:力扣(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;
}
};
如果有問題,歡迎大家指正!!!