字符串旋转结果

文章目录

    • 题目
    • 解法1
    • 解法2


题目

字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

解法1

1.我们再创建两个函数,分别用于左旋和右旋。
2.然后再每旋转一次就和另一个数组比较,当比较完n次后再转一次再比较,这时我们设置一个标志变量来判断最终这两个数组的元素是否都先相等,要是相等直接返回 1 ,要是走完了旋转都没有相等的就返回 0

代码:

void zuoxuan(char * s, int n) {//左旋函数
	char te = *s;//将首元素先给   te 
	for (int i = 0; i < n - 1; i++)//数组整体向左移动
		*(s + i) = *(s + i + 1);
	*(s + n - 1) = te;//移动动完之后再将te放到数组的最后个位置>>这样就完成了一次左移
}
void youxuan(char* s, int n) {//右旋函数
	char te = *(s + n - 1);//将最后一个元素先给   te 
	for (int i = n - 1; i > 0; i--) {//数组整体先右移动
		*(s + i) = *(s + i-1);
	}
	*s = te;//移动完再将te放到数组的第一个位置>>完成右移
}
int zhu(char* s, char* s1, int n) {
	for (int i = 0; i < n-1; i++) {//先进行n-1次的左旋,(使数组从头到尾转一次)
		int t = 0;//标志变量,当t=n是就是两个数组相等
		zuoxuan(s1, n);//调用左旋函数
		for (int j = 0; j < n; j++) {//对两个数组遍历对比
			if (*(s + j) == *(s1 + j))
				t++;
		}
		if (t == n)//判断这次旋转后是否相等,相等返回1
			return 1;
	}
	for (int i = 0; i < n-1; i++) {// 先进行n - 1次的右旋,(使数组从头到尾转一次)
		int t = 0;//标志变量,当t=n是就是两个数组相等
		youxuan(s1, n);//调用右旋函数
		for (int j = 0; j < n; j++) {//对两个数组遍历对比
			if (*(s + j) == *(s1 + j))
				t++;
		}
		if (t == n)//判断这次旋转后是否相等,相等返回1
			return 1;
	}
	return 0;//要是都不相等就返回0
}
int main() {
	char arr[] = "abcd";
	char arr1[] = "ACBD";
	int n = strlen(arr);//求数组长度
	int i = zhu(arr, arr1, n);//调用
	printf("%d\n", i);//打印
	return 0;
}

这种解法非常暴力,时间复杂度为O(n*n),空间复杂度O(1)

解法2

这种解法相对简洁

其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。

在写代码之前先介绍一下三个库函数
1.strcpy
字符串旋转结果_第1张图片
例:

int main() {
	char arr[128] = "qwe";
	char arr1[128];
	strcpy(arr1, arr);
	printf("%s", arr1);
	return 0;
}

运行结果:
字符串旋转结果_第2张图片
2.strcar
在这里插入图片描述
例:

int main() {
	char arr[128] = "qwe";
	char arr1[128]="rty";
	strcat(arr, arr1);
	printf("%s", arr);
	return 0;
}

运行结果
字符串旋转结果_第3张图片
3.strstr

strstr()函数是一个参数为两个字符指针类型,返回值是char*类型的函数。

用于找到子串(str2)在一个字符串(str1)中第一次出现的位置(不包括str2的串结束符),并返回该位置的指针,如果找不到,返回空指针(NULL)。

这里因为传进来的地址指向的内容不会在发生改变,所以我们在两个形参(char*)前加上const。
它包含在string.h头文件中。

char* strstr(const char* str1,const char* str2)

例:

int main() {
	char arr[128] = "qwe";
	char arr1[128]="rtytrqwew";
	char * s=strstr(arr1, arr);
	printf("%s",s);
	return 0;
}

运行结果
字符串旋转结果_第4张图片

最后就是这道题的实现了

代码:

int findRound(const char* src, char* find)
{
	char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串
	strcpy(tmp, src); //先拷贝一遍
	strcat(tmp, src); //再连接一遍AABCDAABCD
	return strstr(tmp, find) != NULL; //看看找不找得到//真返回 1 ,假返回 0 
}
int main() {
	char arr[] = "AABCD";
	char arr1[] = "BCDAA";
	int n = strlen(arr);//求数组长度
	int i = findRound(arr,arr1);//调用
	printf("%d\n", i);//打印
	return 0;
}

时间复杂度为O(1),空间复杂度为O(n)

今天的分享就到这了,谢谢大家的观看

你可能感兴趣的:(算法,刷题,数据结构,c语言,笔记,经验分享)