C语言之字符串旋转结果

一、题目

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

二、解题思路

  1. 首先判断两个字符串的长度是否相等,如果不相等,则s2不可能是s1旋转后的字符串,直接返回0。
  2. 将s1与自身拼接起来形成一个新的字符串s1s1。
  3. 在s1s1中查找s2的第一个字符在s1s1中的位置,如果找不到,则s2不是s1旋转后的字符串,返回0。
  4. 如果找到了s2的第一个字符在s1s1中的位置,那么将s1s1中该位置后面的字符串与s2进行比较,如果相等,则s2是s1旋转后的字符串,返回1;否则,继续查找s2的第一个字符在s1s1中的下一个位置,重复步骤4。
  5. 如果在s1s1中找不到与s2相等的子字符串,则s2不是s1旋转后的字符串,返回0。

三、代码展示

//字符串旋转结果
int isRotation(char* s1, char* s2) {
    int len1 = strlen(s1); // 获取s1的长度
    int len2 = strlen(s2); // 获取s2的长度

    if (len1 != len2) {
        return 0; // 如果s1和s2长度不相等,直接返回0
    }
    char* s1s1 = malloc(strlen(s1) + strlen(s2) + 1);
    if (s1s1 == NULL) exit(1);
    strcpy(s1s1, s1); // 将s1拷贝到s1s1的前半部分
    strcat(s1s1, s1); // 将s1拼接到s1s1的后半部分

    // 在s1s1中查找s2的第一个字符出现的位置
    char* pos = strstr(s1s1, s2);

    while (pos != NULL) {
        // 找到s2的第一个字符在s1s1中的位置后,比较后面的字符串是否相等
        if (strncmp( pos,s2, len2) == 0) {
            return 1; // 如果相等,说明s2是s1旋转后的字符串,返回1
        }
        // 继续查找s2的第一个字符在s1s1中的下一个位置
        pos = strstr(pos + 1, s2);
    }

    return 0; // 在s1s1中找不到与s2相等的子字符串,返回0
}

int main() {
    char s1[] = "AABCD";
    char s2[] = "BCDAA";
    int result = isRotation(s1, s2);
    printf("%d\n", result); // 输出1

    char s3[] = "abcd";
    char s4[] = "ACBD";
    result = isRotation(s3, s4);
    printf("%d\n", result); // 输出0

    return 0;
}

你可能感兴趣的:(C语言,c语言,算法)