1. 程式人生 > >[leetcode]Valid Palindrome (判斷迴文數 C語言實現)

[leetcode]Valid Palindrome (判斷迴文數 C語言實現)

Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
“A man, a plan, a canal: Panama” is a palindrome.
“race a car” is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.
題意:給定一個字串,確定它是否是迴文,只考慮字母、數字字元並忽視其他字元。
for example:
“A man, a plan, a canal: Panama” 是一個迴文數
“race a car”不是迴文數
Notes:
對於這一問題,我們定義了空字串也作為有效的迴文。
解題思路:
迴文數,就是指一個單詞或句子,其順讀和倒讀都是一樣的。
迴文數: A man, a plan, a canal–Panama == amanaplanacanalpannama
由於順讀和倒讀都是一樣的,說明最後一個字母和第一個字母時相等的,倒數第二個字母和第二個字母時相等的,……
所以可以採用前後緊逼法,在字串最後設定一個指標p,在字串起始設定一個指標s,p想前移動,s向後移動,來判斷字串是否為迴文數。
題目要求,除數字、字母外,忽略其他字元,同時字母不區分大小寫
難點:在於細節的處理,如何去除非數字、字母的字元,如何統一大小寫字母,如何設定迴文數的結束條件。
以下是C程式碼實現:

/**
 * 解題思路:迴文數,就是指一個單詞或句子,其順讀和倒讀都是一樣的。
 *  迴文數: A man, a plan, a canal--Panama == amanaplanacanalpannama
 * 由於順讀和倒讀都是一樣的,說明最後一個字母和第一個字母時相等的,倒數第二個字母和第二個字母時相等的,......
 * 所以可以採用前後緊逼法,在字串最後設定一個指標p,在字串起始設定一個指標s,p想前移動,s向後移動,
 * 來判斷字串是否為迴文數。
 * 題目要求,除數字、字母外,忽略其他字元,同時字母不區分大小寫
 */

char compareCHAR(char ch);
bool isPalindrome(char
*s) { int i,length,j; char *p; if(*s == '\0') return 1;//判斷空字元也是迴文數 length = 0; while(*(s + length) != '\0'){//統計字串的長度 length++; } p = s + length - 1;//設定尾指標 i = j = 0; while(s + j != p - i && s + j <= p - i){//當指標p的地址與s的地址相等,或者s的地址必須小於等於p的地址,則退出 if(compareCHAR(*(s + j)) == 0){j++;continue;}//當不是數字、字母時,指標向後移動一位 if(compareCHAR(*(p - i)) == 0){i++;continue;} if(compareCHAR(*(s + j)) == compareCHAR(*(p - i))){ j++; i++; continue; }else{ return 0; } } return 1; } char compareCHAR(char ch){ if(ch >= 48 && ch <= 57){ return ch; }else if(ch >= 65 && ch <= 90){//把A-Z轉化為a-z進行比較 return ch + 32; }else if(ch >= 97 && ch <= 122){ return ch; }else{ return 0; } }