c - 回文C程序困惑

标签 c string palindrome

我正在探索使用字符串,我对这个特定程序有一些疑问。有人可以帮助解释为什么以及如何 x < i/2以及 word[i - 1 - x]有效。

为什么必须是i/2 ?
为什么必须是 word[i - 1 - x]

#include <stdio.h>


int main()
{
     char word[15];
     int i, x;

    printf("Enter a word\n");
    scanf("%s", word);

    for(i = 0; word[i] != '\0';)
        i = i + 1;


    for(x = 0; x< i/2; x++)

        if(word[x] != word[i-1-x])
        {printf("Your word is not a palindrome\n");}
        else
        {
            printf("Your word is a palindrome\n");
        }


}

最佳答案

Why does it have to be i/2?

不一定非要这样:i 也可以,但不是最佳。如果您已经检查了从两端到它的所有字符对,并且字母直到单词的中间都是相同的,那么其余的检查也会成功。

例如考虑单词“alula”。您首先将初始 a 与最后一个 a 进行比较,然后将第二个位置的 ll 进行比较在从后面数第二个位置,然后将 u 与它自己进行比较。现在您已经到达了 i/2 处的单词的中间。如果你继续,你会比较相同的字符对,但你会从不同的索引中挑选它们。保证所有这些对都会匹配,因此您可以通过完全跳过它们来节省一些 CPU 周期。

Why does it have to be word[i - 1 - x]?

因为数组是从零开始的。 i-1 是最后一个字符的索引,因此 i - 1 - x 是从后面数起的第 x 个索引。

关于c - 回文C程序困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27280785/

相关文章:

algorithm - 这个 "compute all palindrome substrings"算法的运行时间是多少?

C、使用 "usleep"函数编译报错

c++ - 如何将 etrace 与动态库一起使用以按时间顺序跟踪 C++ 中的函数调用?

Linux平台上C语言收割时子进程丢失

java - 将扫描仪输入拆分为字符串

java - 如何将一大串整数转换为二进制?

C++ 逐字符比较字符串

java - 排列单词形成回文

c - MSBuild 无法从 CLI 构建。无效的静态调用语法

java - 给定字符串的可能回文检查 - 需要高效代码