LeetCode 125. 驗證迴文串 (C語言)

給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。

說明:本題中,我們將空字符串定義爲有效的迴文串。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章