📜  C |字串|问题11(1)

📅  最后修改于: 2023-12-03 15:13:46.713000             🧑  作者: Mango

C语言字符串问题11

在C语言中,字符串是由一串字符组成,以'\0'表示字符串的结尾。字符串可以通过以下方式定义:

char str[] = "hello world";

或者使用指针:

char *str = "hello world";

在处理字符串时,常常会用到许多字符串相关的函数,比如strlen()、strcat()、strcpy()、strcmp()等等。

题目描述

请实现一个函数int isPalindrome(char *s) ,用于判断给定的字符串是否回文。回文字符串是指从左到右和从右到左读完全相同的字符串。 字符串中只考虑字母和数字,忽略大小写。

函数原型
int isPalindrome(char *s);
参数说明
  • s: 指向待判断的字符串。
返回值
  • 如果s是回文字符串,则返回1。
  • 如果s不是回文字符串,则返回0。
示例
int res = isPalindrome("A man, a plan, a canal: Panama");
printf("%d", res);  // 输出 1
int res = isPalindrome("race a car");
printf("%d", res);  // 输出 0
解题思路

首先,需要对字符串进行处理,只考虑字母和数字。具体来说,可以遍历字符串,通过判断字符的ASCII码值,留下字母和数字,构造一个新的字符串并进行比较。

另外,需要注意,题目中忽略大小写,可以将所有字母转换为小写字母,再进行比较。

参考代码

下面是一个参考实现,代码中使用了头文件<ctype.h>中的函数tolower()isalnum(),分别用于将字母转换为小写字母和判断字符是否为字母或数字。

#include <ctype.h>
#include <stdio.h>
#include <string.h>

int isPalindrome(char *s) {
    int len = strlen(s);
    char newStr[len + 1];
    int j = 0;

    for (int i = 0; i < len; i++) {
        char c = s[i];
        if (isalnum(c)) {
            newStr[j++] = tolower(c);
        }
    }
    newStr[j] = '\0';

    int left = 0, right = strlen(newStr) - 1;
    while (left < right) {
        if (newStr[left++] != newStr[right--]) {
            return 0;
        }
    }

    return 1;
}

int main() {
    int res = isPalindrome("A man, a plan, a canal: Panama");
    printf("%d\n", res);  // 输出 1

    res = isPalindrome("race a car");
    printf("%d\n", res);  // 输出 0

    return 0;
}

上述代码中,使用一个新的字符串newStr,用于存储只包含字母和数字的字符串,之后进行比较。

注意,空字符串也是回文字符串。因此,在返回结果时,需要先判断是否为空字符串。这里将判断空字符串和判断是否回文字符串的逻辑合并了。如果原始的字符串和只包含字母和数字的字符串相同,即是回文字符串,否则不是回文字符串。