📌  相关文章
📜  C程序检查字符串是否相互旋转(1)

📅  最后修改于: 2023-12-03 15:14:26.461000             🧑  作者: Mango

C程序检查字符串是否相互旋转

在本文中,我们将介绍如何编写一个C程序来检查两个字符串是否彼此旋转。例如,"abcd" 和 "cdab" 是相互旋转的字符串。

算法

一个字符串s是另一个字符串t的旋转(或环移),当且仅当s可以通过将t分成两部分x和y(即t = xy)并将它们重新排列形成的字符串得到。具体来说,字符串s=xy,t=yx。例如,t=waterbottle,s=erbottlewat 是旋转关系。

我们可以使用以下算法来检查字符串是否相互旋转:

  1. 确保两个字符串的长度相同。
  2. 将第一个字符串复制一次到一个新的空间中,并在它的末尾追加第一个字符串。例如,如果第一个字符串是 "abcd",则新的字符串将是 "abcdaabcd"。
  3. 检查第二个字符串是否是新字符串的子串。如果是,则它们是相互旋转的字符串,否则它们不是。

这个算法的时间复杂度是O(n),其中n是字符串的长度。

代码实现

下面是用C语言实现上述算法的代码:

#include <stdio.h>
#include <string.h>

// 检查字符串是否相互旋转
int is_rotation(char s[], char t[]) {
    int len_s = strlen(s);
    int len_t = strlen(t);

    // 如果长度不同,肯定不是旋转字符串
    if (len_s != len_t) {
        return 0;
    }

    // 构造新字符串
    char str[len_s*2 + 1];
    strcpy(str, s);
    strcat(str, s);

    // 检查 t 是否是新字符串的子串
    if (strstr(str, t) != NULL) {
        return 1;
    } else {
        return 0;
    }
}

int main() {
    char s[] = "abcd";
    char t[] = "cdab";

    if (is_rotation(s, t)) {
        printf("%s and %s are rotation of each other.\n", s, t);
    } else {
        printf("%s and %s are not rotation of each other.\n", s, t);
    }

    return 0;
}

我们首先定义了一个 is_rotation 函数,用于检查两个字符串是否相互旋转。接下来,在主函数中,我们定义了两个字符串并将它们传递给 is_rotation 函数进行检查。如果它们是相互旋转的字符串,则输出相应的消息。

总结

在本文中,我们介绍了如何编写一个C程序来检查两个字符串是否相互旋转。我们展示了一个简单但有效的算法,并提供了具体的代码实现。如果你想进一步了解字符串操作,可以查看标准库中的字符串函数,例如 strlenstrcpystrcatstrstr