判断一个字符串是否是另一个字符串翻转后的结果

本文介绍了一种字符串翻转的方法,通过定义翻转函数并利用整体翻转与局部翻转结合的方式实现向左或向右翻转指定位置的效果。文章还提供了一段C语言代码示例,展示了如何判断一个字符串是否可以通过翻转操作变成另一个字符串。

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

字符串abcdef向左翻转一位的结果为fabcde,向右翻转翻转一位的结果为bcdefa.向左翻转两位的结果为efabcd,向右翻转两位的结果为cdefab。

要判断一个字符串是否是另一个字符串翻转后的结果,必须遍历向左翻转和向右翻转0-len(arr)-1位的所有情况。

我定义了一个翻转函数reverse,返回值为空,参数为两个指针,第一个是翻转的起始地址,第二个是翻转的结束地址。要想实现向左翻转n位的效果,先对字符串整体翻转,然后把第n位,到len(arr)-1位进行翻转就得到了向左翻转的结果。要实现向右翻转,也是对整体翻转,然后把第0位到第n位进行翻转就得到了向右翻转的结果。

为了节约空间,我没有开辟其他数组,所以每次翻转后,还需要把字符串恢复为原始的abcdef。
实现代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char* begin, char* end)
{
    int tmp = 0;
    //char* p = begin;
    while (begin< end)
    {
        tmp = *begin;
        *begin = *end;
        *end = tmp;
        begin++;
        end--;
    }

}
int cmp_reverse(char arr[], char arr2[],int len,char * begin)
{
    if (strcmp(arr, arr2) == 0)
    {
        return 1;
    }
    for (int i = 1; i < len; i++)
    {
        reverse(begin, begin + len-1);
        reverse(begin+i, begin + len-1);
        if (strcmp(arr, arr2) == 0)
        {
            return 1;
        }
        else
        {
            reverse(begin + i, begin + len - 1);
            reverse( begin, begin + len - 1);

        }
    }
    for (int i = 1; i < len; i++)
    {
        reverse(begin, begin + len - 1);
        reverse(begin , begin+ len -1 -i);
        reverse(begin + len - i, begin + len - 1);
        if (strcmp(arr, arr2) == 0)
        {
            return 1;
        }
        else
        {
            reverse(begin + len - i, begin + len - 1);
            reverse(begin, begin + len - 1 - i);
            reverse(begin, begin + len -1);


        }
    }
    return 0;
}
int main()
{
    char arr[] = "abcdef";
    char arr2[] = "cdefab";
    int len = strlen(arr);
    char * begin = arr;
    //char * end = &arr[len - 1];
    //char * p = end;
    if (cmp_reverse(arr,arr2,len,begin) == 1)
        printf("y");
    else
        printf("n");


    //printf("%s", arr);
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值