📅  最后修改于: 2023-12-03 15:13:46.713000             🧑  作者: Mango
在C语言中,字符串是由一串字符组成,以'\0'表示字符串的结尾。字符串可以通过以下方式定义:
char str[] = "hello world";
或者使用指针:
char *str = "hello world";
在处理字符串时,常常会用到许多字符串相关的函数,比如strlen()、strcat()、strcpy()、strcmp()等等。
请实现一个函数int isPalindrome(char *s) ,用于判断给定的字符串是否回文。回文字符串是指从左到右和从右到左读完全相同的字符串。 字符串中只考虑字母和数字,忽略大小写。
int isPalindrome(char *s);
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
,用于存储只包含字母和数字的字符串,之后进行比较。
注意,空字符串也是回文字符串。因此,在返回结果时,需要先判断是否为空字符串。这里将判断空字符串和判断是否回文字符串的逻辑合并了。如果原始的字符串和只包含字母和数字的字符串相同,即是回文字符串,否则不是回文字符串。