题目

判断字符串是否为回文

思路

i=0, j=len-1,不等则否;i<j 时同步移动。含空串与单字符视为回文。

解题分析

回文串首尾对称。双指针从两端向中间比较,不等则否;全比完则是。不必真的反转整串,下标 walk 即可,也避免依赖 strlen 库函数。

完整程序

#include <stdio.h>

int main(void)
{
    char s[500];
    if (scanf("%499s", s) != 1) {
        return 1;
    }
    int len = 0;
    while (s[len]) {
        len++;
    }
    int i = 0, j = len - 1;
    while (i < j) {
        if (s[i] != s[j]) {
            printf("no\n");
            return 0;
        }
        i++;
        j--;
    }
    printf("yes\n");
    return 0;
}

运行示例

输入:

level

输出:

yes

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

先求长度再双指针

与正文相同思路,把求长度单独写清楚,全程不用库函数。

程序:

#include <stdio.h>

int main(void)
{
    char s[500];
    if (scanf("%499s", s) != 1) {
        return 1;
    }
    int len = 0;
    while (s[len]) {
        len++;
    }
    int i = 0, j = len - 1;
    while (i < j) {
        if (s[i] != s[j]) {
            printf("no\n");
            return 0;
        }
        i++;
        j--;
    }
    printf("yes\n");
    return 0;
}

运行示例

输入:

level

输出:

yes