title: 每日一練(40):驗證迴文串
categories:[劍指offer]
tags:[每日一練]
date: 2022/04/12
每日一練(40):驗證迴文串
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們將空字串定義為有效的迴文串。
示例 1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
解釋:"amanaplanacanalpanama" 是迴文串
示例 2:
輸入: "race a car"
輸出: false
解釋:"raceacar" 不是迴文串
提示:
1 <= s.length <= 2 * 105
字串 s 由 ASCII 字元組成
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
方法一:字串預處理 + 雙指標
思路分析
isalnum:判斷字元變數c是否為字母或數字,若是則返回非零,否則返回零。
tolower:把字母字元轉換成小寫,非字母字元不做出處理
1.先把字串s做處理
2.雙指標判斷,左指標指向第一個位置,右指標指向最後一個位置,依次判斷是否相同
bool isPalindrome(string s) {
string str;
for (const char &ch : s) {
if (isalnum(ch)) {
str.push_back(tolower(ch));// 將數字和字母儲存在 str 中,大寫字母轉換成小寫
}
}
// 左指標指向第一個位置,右指標指向最後一個位置
// 依次比較是否相同
int l = 0, r = str.size() - 1;
while (l < r) {
if (str[l] != str[r]) {
return false;
}
l++;
r--;
}
return true;
}
方法二:篩選 + 判斷
思路分析
對字串 s 進行一次遍歷,並將其中的字母和數字字元進行保留,放在另一個字串 sgood 中。這樣我們只需要判斷 sgood 是否是一
個普通的迴文串即可
使用語言中的字串翻轉 API 得到 sgood 的逆序字串 sgood_rev
bool isPalindrome(string s) {
string sgood;
for (const char &ch : s) {
if (isalnum(ch)) {
sgood.push_back(tolower(ch));// 將數字和字母儲存在 sgood 中,大寫字母轉換成小寫
}
}
string sgood_rev(sgood.rbegin(), sgood.rend());// API逆轉字串
return sgood == sgood_rev;
}