C语言判断字符串回文数
在C语言中,判断一个字符串是否是回文数(正读和反读都相同的字符串)可以通过以下几种方法实现:
双指针法
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 用于tolower函数
int isPalindrome(const char *str) {
int left = 0;
int right = strlen(str) - 1;
while (left < right) {
// 跳过非字母数字字符(可选)
while (left < right && !isalnum(str[left])) left++;
while (left < right && !isalnum(str[right])) right--;
// 比较字符(不区分大小写)
if (tolower(str[left]) != tolower(str[right])) {
return 0; // 不是回文
}
left++;
right--;
}
return 1; // 是回文
}
int main() {
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; // 去除换行符
if (isPalindrome(str)) {
printf(" \"%s\" 是回文数\n", str);
} else {
printf(" \"%s\" 不是回文数\n", str);
}
return 0;
}
反转字符串比较法
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void reverseString(char *str) {
int left = 0;
int right = strlen(str) - 1;
while (left < right) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
}
int isPalindrome(const char *str) {
char reversed[100];
strcpy(reversed, str);
reverseString(reversed);
// 比较原字符串和反转后的字符串(不区分大小写)
for (int i = 0; str[i]; i++) {
if (tolower(str[i]) != tolower(reversed[i])) {
return 0;
}
}
return 1;
}
int main() {
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; // 去除换行符
if (isPalindrome(str)) {
printf(" \"%s\" 是回文数\n", str);
} else {
printf(" \"%s\" 不是回文数\n", str);
}
return 0;
}
递归法
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPalindromeRecursive(const char *str, int left, int right) {
if (left >= right) {
return 1;
}
// 跳过非字母数字字符(可选)
if (!isalnum(str[left])) {
return isPalindromeRecursive(str, left + 1, right);
}
if (!isalnum(str[right])) {
return isPalindromeRecursive(str, left, right - 1);
}
// 比较字符(不区分大小写)
if (tolower(str[left]) != tolower(str[right])) {
return 0;
}
return isPalindromeRecursive(str, left + 1, right - 1);
}
int isPalindrome(const char *str) {
return isPalindromeRecursive(str, 0, strlen(str) - 1);
}
int main() {
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0'; // 去除换行符
if (isPalindrome(str)) {
printf(" \"%s\" 是回文数\n", str);
} else {
printf(" \"%s\" 不是回文数\n", str);
}
return 0;
}
注意事项
- 代码都处理了大小写不敏感的情况(如"A man, a plan, a canal: Panama"会被认为是回文)
- 如果需要区分大小写,可以去掉
tolower()函数调用 - 方法一(双指针法)是最优解,空间复杂度为O(1),时间复杂度为O(n)
- 方法二需要额外的空间来存储反转后的字符串
- 方法三递归解法虽然简洁,但对于很长的字符串可能会导致栈溢出
选择哪种方法取决于具体需求和场景,通常推荐使用双指针法。
