C语言如何判断字符串是否为回文数?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

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

注意事项

  1. 代码都处理了大小写不敏感的情况(如"A man, a plan, a canal: Panama"会被认为是回文)
  2. 如果需要区分大小写,可以去掉tolower()函数调用
  3. 方法一(双指针法)是最优解,空间复杂度为O(1),时间复杂度为O(n)
  4. 方法二需要额外的空间来存储反转后的字符串
  5. 方法三递归解法虽然简洁,但对于很长的字符串可能会导致栈溢出

选择哪种方法取决于具体需求和场景,通常推荐使用双指针法。

-- 展开阅读全文 --
头像
织梦免签约支付平台如何实现免签约?
« 上一篇 昨天
织梦还原表结构信息,具体步骤是?
下一篇 » 今天
取消
微信二维码
支付宝二维码

目录[+]