字符串中旋转字符,旋转字符并判断是否为另一个字符串旋转得到的。

1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

思路:

我们可以先让应该旋转的k个字符翻转,再让其他的字符翻转,最后一起翻转,就能够实现字符的旋转。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

void Reverse(char *p,char *q)//字符串的翻转
{
    while(p < q)  
    {  
        char a = *p;  
        *p = *q;  
        *q = a;  
        p++;  
        q--;  
    }  
}  
void Leftturn(char *a, int len,int n)//旋转字符函数
{
       Reverse(&a[0],&a[n-1]);//前k个字符翻转
       Reverse(&a[n],&a[len-1]);//其它字符翻转
       Reverse(&a[0],&a[len-1]);//所有字符一起翻转

}
int main()
{
    char arr[] = "ABCDE";
    int s = 0;
    int sz = strlen(arr);
    printf("请输入想要旋转字符个数\n");
    scanf("%d",&s);
    Leftturn(arr,sz,s);
    printf("%s",arr);
    return 0;
}

2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

思路:

在上一题的基础上做出右旋,并且运用strcmp函数来进行验证。

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
void Reverse(char *p,char *q)
{
    while(p < q)  
    {  
        char a = *p;  
        *p = *q;  
        *q = a;  
        p++;  
        q--;  
    }  
}  
int  Judgeturn(char a[],char b[], int len)
{
        int i = 0;
        char *p = malloc(len);//开辟一个动态空间
        //  左旋
        for(i=0; i<len; i++)
        {
          strcpy(p,a);//将a字符串复制给动态p
          Reverse(&p[0],&p[i]);
          Reverse(&p[i+1],&p[len-1]);
          Reverse(&p[0],&p[len-1]);
          if(strcmp(p,b) == 0)//旋转后的字符串p与字符串b对比验证
          {
          return 1;
          }

        }
        // 右旋
        for(i=0; i<len; i++)
        {
          strcpy(p,a);
          Reverse(&p[len-i],&p[len-1]);
          Reverse(&p[0],&p[len-i-1]);
          Reverse(&p[0],&p[len-1]);
          if(strcmp(p,b) == 0)
          {
          return 1;
          }
        }  
     return 0;
     free(p);

}
int main()
{
    char arr[] = "ABCDE"; 
    char s[] = "DEABC"; 
    int sz = strlen(arr);
    int ret = 0;
    ret = Judgeturn(arr,s,sz);
    if( ret == 1)
    {
    printf("是由原字符串旋转得到的\n");
    }
    else
    {
        printf("不是由原字符串旋转得到的\n");
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值