每日一練(40):驗證迴文串

加班猿發表於2022-04-18

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;
}

相關文章