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

/*
判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值