[C语言]判断一个字符串是否为另外一个字符串旋转之后的字符串。

文章介绍了两种C语言函数来判断一个字符串是否是另一个字符串旋转后的结果。方法一是通过逐次旋转并比较,方法二是通过字符串拼接后再查找子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

AABCD左旋转一个字符得到ABCDA

AABCD左旋转二个字符得到BCDAA

AABCD右旋转一个字符得到DAABC

法一:将str1每次旋转一个字符比较是否与str2相等,依次比较直至旋转完所有的字符,在此期间若两字符串相等返回1,否则返回0。

#include <stdio.h>
#include <assert.h>
#include <string.h>
int is_string_rotation1(char* str1, char* str2) {
    assert(str1);
    assert(str2);
    int i = 0;
    int n = strlen(str1);
    for (i = 0; i < n; i++) {
        //每次旋转一个字符
        char temp = *str1;
        int j = 0;
        //后面n-1个字符向前移动
        for (j = 0; j < n - 1; j++) {
            *(str1 + j) = *(str1 + j + 1);
        }
        //将temp放在最后
        *(str1 + n - 1) = temp;
        //比较是否相同
        if (strcmp(str1, str2) == 0) {
            return 1;
        }
    }
    return 0;
}
int main() {
    
    char arr1[20] = "AABCD";
    char arr2[] = "DAABC";
    int ret=is_string_rotation1(arr1, arr2);
    if (1 == ret) {
        printf("yes\n");
    }
    else {
        printf("no\n");
    }
    return 0;
}

运行结果:

法二:使用库函数strncat在str1字符串后追加一个str1字符串,这样追加后的str1字符串有没追加str1之前的字符串所有旋转的情况,再判断str2是否是str1追加之后的字串,若是字串返回1,否则返回0。

#include <stdio.h>
#include <assert.h>
#include <string.h>
int is_string_rotation2(char* str1, char* str2) {
    assert(str1);
    assert(str2);
    if (strlen(str1) != strlen(str2)) {//两个字符串不相等,不可能旋转得到
        return 0;
    }
    //str1字符串后追加一个str1
    //strcat(str1, str1);
    int len = strlen(str1);
    strncat(str1, str1, len);
    //判断str2是否为str1的字串
     char* ret=strstr(str1, str2);
     return ret != NULL;
}
int main() {
    char arr1[20] = "AABCD";
    char arr2[] = "DAABC";
    int ret=is_string_rotation2(arr1, arr2);
    if (1 == ret) {
        printf("yes\n");
    }
    else {
        printf("no\n");
    }
    return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值