判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

AABCD右旋两个字符得到CDAAB

1、将左旋和右旋所有的情况列举出来,然后通过for循环不断进行比较,此法效率较低。

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void revolve(char str[],int left,int right)
{//逆序字符串
	while(left<right)
	{
		char temp=str[left];
		str[left]=str[right];
		str[right]=temp;
		left++;
		right--;
	}
}

int judge(char arr[],char str[],int len1,int len2)
{
	int k,i;
	char p1[10]={0},p2[10]={0};
	if(len1==len2)
	{
		for(k=0;k<len1;k++)
	    {
            revolve(arr,0,len1-1);	
	        revolve(arr,len1-k,len1-1);
	        revolve(arr,0,len1-k-1);
			for(i=0;i<len1;i++)
			{
				p1[i]=arr[i];//将左旋的字符串保存在数组p1中
			}
            revolve(arr,0,len1-1);
			revolve(arr,0,k-1);
			revolve(arr,k,len1-1);
			for(i=0;i<len1;i++)
			{
				p2[i]=arr[i];//将右旋的字符串保存在数组p2中
			}
			if((strcmp(p1,str)==0)||(strcmp(p2,str)==0))
                     //判断要比较的数组是不是另一个字符串左旋或右旋得到的结果
				return 1;
		}return 0;
	}
	else return 0;
}

int main()
{
	char arr[10]={0},str[10]={0};
	int len1,len2,var;
	printf("请输入要判断的两个字符串:\n");
	gets(arr);
	gets(str);
	len1=strlen(arr);
	len2=strlen(str);
	var=judge(arr,str,len1,len2);//返回值为var
	printf("%d\n",var);
	system("pause");
	return 0;
}

2、根据左旋或右旋结果和原字符串的联系,可以将一个给定的字符串拷贝一份放在该字符串的后面得到新的字符串,只需要判断另一个字符串是不是组合的新字符串的子字符串就可以解决问题。

例如:给定的一个字符串为ABCDE,经过拷贝后的字符串为ABCDEABCDE,观察这个字符串,能够发现给定的字符串ABCDE经过左、右旋的所有情况为字符串ABCDEABCDE的子串。

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* my_strncat(char *dest,char *stc,int len)
{
	char *cp=dest;
	while(*cp)
		cp++;
	while((*stc!='\0')&&(len--))
	    *cp++=*stc++;
	*cp='\0';
	return dest;
}

int main()
{
	char arr[20]={0};
	char str[10]={0};
	char *ret;
	printf("请输入要判断的两个字符串:\n");
	gets(arr);
	gets(str);
	if(strlen(arr)==strlen(str))//判断两个字符串是否长度一样
	{
		my_strncat(arr,arr,strlen(arr));//两个相同的字符串合并,注意此处不能用strcat函数
	    ret=strstr(arr,str);//strstr函数判断后面函数是不是前面函数的子字符串
		if(ret!=NULL)
		printf("yes!\n");
		else printf("no!\n");
	}
	else printf("no!\n");
	system("pause");
	return 0;
}

strcat函数

函数原型:extern char *strcat(char *dest,char *src)
参数说明:dest为一个目的字符串的指针,即被连接的字符串(在前),src为一个源字符串的指针(在后)。
所在库名:#include <string.h>
函数功能:把src所指字符串添加到dest结尾处实现字符串的连接,连接过程覆盖dest结尾处的'/0',该函数直到遇到'\0'才结束。
返回说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串返回指向dest的指针。

strncat函数

函数原型:extern char *strncat(char *dest,char *src,int n)
参数说明:src为源字符串,dest为目的字符串,n为指定的src中的前n个字符。
所在库名:#include <string.h>
函数功能:把src所指字符串的前n个字符添加到dest结尾处,覆盖dest结尾处的'/0',实现字符串连接。
返回说明:返回指针,连接后的字符串。