/*
判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
*/
//思路:
//1.将一个字符串复制一次,添加到该字符串之后;
//2.在1中的字符串中找是否有与另一个字符串匹配的字符串子串:
//a)若找到,则一个字符串是另外一个字符串旋转之后的字符串;
//b)若没找到,则一个字符串不是另外一个字符串旋转之后的字符串;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//输入字符串长度函数(返回长度)
int input_len(){
int len;
printf("请输入字符串长度:\n");
scanf("%d", &len); //保存字符串长度
return len;
}
//输入第一个字符串函数(返回字符串首元素地址)
char* input_string1(int len,int double_len){
char *str1;
int i;
str1 = (char*)malloc(sizeof(char)*(double_len + 1)); //开辟存储空间
while(getchar() != '\n'); //吸收输入缓冲区的冗余数据
printf("请输入第一个字符串(超出长度%d的部分不计入):\n",len);
//录入第一个字符串的内容
for (i = 0; i < len; ++i){
str1[i] = getchar();
}
str1[i] = '\0'; //录入字符串的结束符
return str1;
}
//录入第二个字符串函数(返回字符串首元素地址)
char* input_string2(int len){
char *str2;
int i;
str2 = (char*)malloc(sizeof(char)*(len + 1)); //开辟存储空间
while (getchar() != '\n'); //吸收输如缓冲区的冗余数据
printf("请输入第二个字符串(超出长度%d的部分不计入):\n",len);
//录入第二个字符串
for (i = 0; i < len; ++i){
str2[i] = getchar();
}
str2[i] = '\0'; //录入字符串的结束符
return str2;
}
//复制添加字符串函数
void copy_increase_string(char str[],int len,int double_len){
int i; //用以遍历待赋值空间
int count = 0; //用以遍历已赋值字符空间
//复制字符串
for (i = len; i < double_len; ++i){
str[i] = str[count]; //复制字符串
++count; //count加1
}
str[i] = '\0'; //添加字符串末尾的结束符
}
//找子字符串函数
int find_Substring(char* str1, char* str2){
char* point1 = str1;
char* point2;
while (*str1 != '\0'){
point2 = str2; //指针point2指向str2
while (*point1 == *point2 && *point1 != '\0'){
++point1; //指针point1针向后移
++point2; //指针point2向后移
if (*point2 == '\0'){
return 1;
}
}
++str1; //指针str1向后移
point1 = str1; //指针point指向指针str指向的后一个字符
}
return 0;
}
//主函数
int main(){
int ret;
char* p = NULL;
char* q = NULL;
int len = input_len(); //调用输入长度函数
int double_len = len * 2; //复制字符串需要的长度
p = input_string1(len,double_len); //调用输入第一个字符串函数
q = input_string2(len); //调用输入第二个字符串函数
copy_increase_string(p,len,double_len); //调用复制添加字符串函数
ret = find_Substring(p, q); //调用找子字符串函数
//判定查找结果,并输出提示信息
if (ret == 0){
printf("第二个字符串不是第一个字符串的左旋.\n");
}
else{
printf("第二个字符串是第一个字符串的左旋.\n");
}
system("pause");
return 0;
}