函数回顾
- 由题目可知,判断两个字符串,我们可以想到一个字符串已知,另一个字符串若要我们键盘输入检测的话需要使用字符串输入函数gets(数组名);此函数的作用是从终端输入一个字符串到字符数组中去,并得到一个函数值,此函数值是字符数组的起始地址。
- 此外,要代码实现比较字符串需要用到字符串比较函数——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;
}