給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。
說明:本題中,我們將空字符串定義爲有效的迴文串。
示例 1:
輸入: "A man, a plan, a canal: Panama" 輸出: true
示例 2:
輸入: "race a car" 輸出: false
算法思想:
無非就是需要同時從頭和從尾向中間遍歷字符串數組,如果是字母或者數字,則進行比較;若是其他字符則跳過。
那麼問題來了,如何判斷當前字符是否是數字或字母 ,如果是字母,還得進行大小寫的轉換,以便於比較。一種方法就是手動判斷是否是數字或字母,然後進行比較;另一種方法就是調用isalnum函數和tolower函數。
isalnum:判斷字符變量c是否爲字母或數字,若是則返回非零,否則返回零。
tolower:功能是把字母字符轉換成小寫,非字母字符不做出處理。
代碼如下:
方法一:調用c庫函數
bool isPalindrome(char* s) {
int len = strlen(s);
int j = 0;
char array[len + 1];
/* 將原字符串中的字母和數字拷貝到新字符串,並將其轉換成小寫字母 */
for(int i = 0; i < len; i++)
{
if(isalnum(s[i]))
{
array[j++] = tolower(s[i]);
}
}
array[j] = '\0';
/* 獲取新字符串長度 */
len = strlen(array);
/* 判斷是否迴文 */
for(int i = 0; i < len/2; i++)
{
if(array[i] != array[len - i - 1])
return false;
}
return true;
}
方法二:手動判斷並轉換大小寫
bool isPalindrome(char* s) {
int i = 0, j = strlen(s) - 1;
while(i < j){
if(s[i] >= 'A' && s[i] <= 'Z'){ //大寫轉小寫
s[i] += 32;
}
if((s[i] < '0' || s[i] > '9') && (s[i] < 'a' || s[i] > 'z' )){
i++;
continue;
}
if(s[j] >= 'A' && s[j] <= 'Z'){
s[j] += 32;
}
if((s[j] < '0' || s[j] > '9') && (s[j] < 'a' || s[j] > 'z' )){
j--;
continue;
}
if(s[i] != s[j]) {
return false;
}
i++;
j--;
}
return true;
}