题目一:
实现一个函数可以左旋字符串中的k个字符
例如:
字符串“ABCDEF”左旋一个字符得到“BCDEFA”
字符串“ABCDEF”左旋两个字符得到“CDEFAB”
思路:

如果要旋转一个字符,可以先将第一个字符放在临时变量中,在把后面的字符逐个移位,再把temp放在最右边
代码实现:
#include<stdio.h>
#include<string.h>
void left_move(char* arr,int k)
{
char temp;
int i,j;
int len=strlen(arr);
for(i=0;i<k;i++)
{
//存放要旋转的字符
temp=*arr;
//将后面的字符逐个移位
for(j=0;j<len-1;j++)
{
*(arr+j)=*(arr+j+1);
}
*(arr+j)=temp;
}
}
int main()
{
char arr[]="ABCDEF";
int k;
printf("请输入k的值:\n");
scanf("%d",&k);
left_move(arr,k);
printf("%s\n",arr);
return 0;
}
这种方法容易去思考,但是一次一次进行旋转比较麻烦,下面我们用另一种思路进行求解
思路:
对于字符串“ABCDEF”假如需要翻转两个字符:
先将AB翻转BA:BACDEF
再将CDEF翻转:BAFEDC
再翻转整体:CDEFAB
代码实现:
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left,char* right)
{
char temp;
while(left<right)
{
temp=*left;
*left=*right;
*right=temp;
left++;
right--;
}
}
void left_move(char* arr,int k)
{
assert(arr!=NULL);
int len=strlen(arr);
assert(k<len);
//将每一部分进行翻转
reverse(arr,arr+k-1);
reverse(arr+k,arr+len-1);
reverse(arr,arr+len-1);
}
int main()
{
char arr[]="ABCDEF";
int k;
printf("请输入k的值:\n");
scanf("%d",&k);
left_move(arr,k);
printf("%s\n",arr);
return 0;
}
题目二:
写一个函数判断一个字符串是否为一个字符串翻转之后的字符串
例如:给定s1=“AABCD”和s2=“BCDAA” 返回0
给定s1=“abcde”和s2=“ABCDE” 返回0
思路:
将字符串每次翻转一个字符之后的字符串与s2一一进行比较
代码实现:
#include<stdio.h>
#include<string.h>
void reverse(char* s1,int k)
{
int i,j;
int len=strlen(s1);
char temp=*s1;
for(i=0;i<k;i++)
{
for(j=0;j<len-1;j++)
{
*(s1+j)=*(s1+j+1);
}
}
*(s1+len-1)=temp;
}
int left_move(char* s1,char* s2)
{
int i=0,f=0;
int len=strlen(s1);
for(i=0;i<len;i++)
{
reverse(s1,1);//每次翻转之后s1都发生了变换,下一次只需要翻转1次
if(strcmp(s1,s2)==0)
{
f=1;
break;
}
}
if(f==1)
return 1;
else
return 0;
}
int main()
{
char s1[]="AABCD";
char s2[]="CDAAB";
int f=0;
f=left_move(s1,s2);
if(f==1)
{
printf("YES\n");
}
else
printf("NO");
return 0;
}
这种做法是题目一的延伸,但这种将字符串s1一次一次的翻转也是很麻烦,那我们再来换个方向去思考:
思路:
我们知道将s1=“AABCD”一次一次的翻转一共会6种情况:
"ABCDA"
"BCDAA"
"CDAAB"
"DAABC"
"AABCD"
但如果将s1链接自己本身:AABCDAABCD,仔细观察这里面包含了上面所有的情况:

由上图我们知道,只要s2是s1翻转之后的结果,那必然是“AABCDAABCD”的子集,而strstr函数就是判断两个字符串是否为子集关系
代码实现:
#include<stdio.h>
#include<string.h>
int if_move(char* s1,char*s2)
{
int len=strlen(s1),i=0,j=0,f=1;
char* t;
strcat(s1,s1);
strstr(s1,s2);
if(t==NULL)
return 0;
else
return 1;
}
int main()
{
char s1[50]="AABCD";
char s2[50]="BCDAA";
int f=0;
f=if_move(s1,s2);
if(f==1)
printf("YES\n");
else
printf("NO\n");
return 0;
}