來源:力扣(LeetCode)
題目:給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。我們將空字符串定義爲有效的迴文串。
示例 1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
示例 2:
輸入: "race a car"
輸出: false
大致思路就是把字符串的第一個字母字符和最後一個字母字符作比較,符合則雙方向中間移動,一個比較,有不符合的則不是迴文串。這裏遇見特殊字符(比如逗號冒號)直接再往後走一步,遇見空格也是,還有大小寫也是不區分的。可以藉助函數來實現這些功能,簡單介紹一哈:
函數 int ispunct(int c) 檢查所傳的字符是否是標點符號字符,(C庫)頭文件<ctype.h>,如果 c 是一個標點符號字符,則該函數返回非零值(true),否則返回 0(false)。
**函數int isspace ( int c )**檢查一個字符串是否爲空白字符。(C庫)頭文件<ctype.h>,返回值爲非零(真)表示c是空白符,返回值爲零(假)表示c不是空白符。
**函數int tolower ( int c )**用來將大寫字母轉換爲小寫字母。如果轉換成功,那麼返回與 c 對應的小寫字母;如果轉換失敗,那麼直接返回 c(值未變)。注意,返回值爲 int 類型,你可能需要隱式或者顯式地將它轉換爲 char 類型。與之對應是函數int toupper(int c)用來將小寫字母轉換爲大寫字母。如果轉換成功,那麼返回與 c 對應的大寫字母;如果轉換失敗,那麼直接返回 c(值未變)。
直接上代碼:
bool isPalindrome(string s) {
if(!s.size())
return true;
int i=0,j=s.size()-1;
while(i<j)
{
if(ispunct(s[i])||isspace(s[i]))
{
++i;
continue;
}
if(ispunct(s[j])||isspace(s[j])){
--j;
continue;
}
if(tolower(s[i])==tolower(s[j])){
++i;
--j;
}
else
return false;
}
return i>=j?true:false;
}