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

 

你可能感兴趣的:(LeetCode刷题)