C语言实现判断一个字符串是否为另一个字符串旋转所得

函数回顾

  1. 由题目可知,判断两个字符串,我们可以想到一个字符串已知,另一个字符串若要我们键盘输入检测的话需要使用字符串输入函数gets(数组名);此函数的作用是从终端输入一个字符串到字符数组中去,并得到一个函数值,此函数值是字符数组的起始地址。
  2. 此外,要代码实现比较字符串需要用到字符串比较函数——strcmp函数,函数一般形式是strcmp(str1,str2)函数比较规则为将两个字符串的字符自左向右逐个比较,直至遇到不同的字符或者’\0’为止,若全部字符都相等,则字符串相等,函数值为0;若字符串不相等,则以第一对不同的字符比较为准,比较是按照ASCII码的值的大小比较,越靠后的值越大,str1>str2函数返回一个正整数,str1<str2函数返回一个负整数。

思路解析

解决本题之前,我们先看一下如何实现字符串的左旋(右旋可以转化为左旋问题)。对于已经提供的字符串"ABCD",左旋一个字符变成"BCDA",左旋两个字符变为"CDAB",以此类推,同时左旋五个字符和左旋一个字符达到的效果一样。
若控制字符串实现k个字符的左旋,可以用一个外循环控制左旋的次数,而内循环实现字符串的移动,每一次循环将字符串的后一个字符前移一位,直至外循环结束左旋达到最终的效果,下面一起来看看代码的实现吧:

#inlcude<stdio.h>
#include<string.h>
void left_Rol(char* str,int k)
{	
	int size=strlen(str);
	int i,j,temp;
	for(i=0;i<k;i++)         //外循环控制左旋的次数
	{
		temp = str[0];      
		for(j=0;j<size-1;j++)    //每次外循环都将第一个之后的字符前移一位
		{
			str[j]=str[j+1];
		}
		str[size-1] = temp;       //将第一位字符放在最后
	}
}
int main()
{
	char array[]="pudding dog";
	int n,i,sz;
	sz=sizeof(array)/sizeof(array[0]);
	printf("旋转之前的字符串");
	printf("%s",array);
	printf("请输入左旋的位数:");
	scanf("%d",&n);
	left_Rol(array,n);
	for(i=0;i<sz;i++)
	printf("%c",array[i]);
}

了解完上述左旋的实现后,咱们来看看此题的常规思路是将原字符串左旋1到字符串长度减一位,将每一次左旋的字符串与所给的字符串比较,若相同则返回并停止循环,不同则继续左旋,等所有左旋结果都与所给字符串不匹配的时候,就说明所给字符串无法通过原字符串左旋(或右旋)得到。下面来看看代码实现吧:

#include<stdio.h>
#include<string.h>
int string_Check(char*p ,char* q,int k)
{
	int size = strlen(p);
	int i,j,temp;
	for(i=0;i<k;i++)      //控制左旋的字符数
	{
		temp = p[0];
		for(j=0;j<size-1;j++)         //内循环控制字符串字符的移动
		{
			p[j]=p[j+1];
		}
		p[size-1]=temp;
   }
   return strcmp(p,q);
}


int main()
{
	char arr[]="ABCD";
	int sz = sizeof(arr)/sizeof(srr[0]);
	char str[sz];
	gets(str);
	if(strcmp(arr,str)==0)   //先判断两个字符串是否相同
	{printf("是的!");
	return0;
	}
	int i,sz1,sz2,w;
	sz1=strlen(arr);
	sz2=strlen(str);
	if(sz1==sz2)        //若字符串长度相同进行比较,长度不同一定不会通过旋转得到
	{
		for(i=1;i<sz-1;i++)
		{
			w = string_Check(arr,str,i);  //旋转的情况有1到字符串长度减一,其他的长度也可以转为这些长度
			if(w==0)
			{
				printf("是的!");
			     break;
			}
        }
        if(w!=0)
        printf("不是!");          //字符串比较函数返回非零的数,说明不能通过旋转获得
   }
   else        //两字符串长度不同,不是通过旋转所得
   printf("不是!";
   return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值