判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
第一直接查找
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void RotateString(char* arr,int size) {
int i = 0;
char tmp = arr[0];
for (i = 1; i < size; ++i) {
arr[i - 1] = arr[i];
}
arr[size - 1] = tmp;
}
int RS(char* arr, int size,int k,char* arr1) {
while (k--) {
RotateString(arr,size);
if (strcmp(arr, arr1) == 0) {
return 1;
}
}
return 0;
}
int main() {
int x;
char arr[] = "AABCD";
char arr1[] = "ABCDA";
int size = strlen(arr);
x = size;
printf("%d\n", RS(arr, size, x, arr1));
system("pause");
return 0;
}
第二暴力查找法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Judje(char*arr, char*arr1) {
int i = 0;
int j = 0;
int len = strlen(arr);
for (i = 1; i <= len;++i) {
{
int tmp = arr[0];
for (j = 0; j < len - 1; ++j) {
arr[j] = arr[j + 1];
}
arr[len - 1] = tmp;
}
if (strcmp(arr, arr1) == 0) {
return 1;
}
}
return 0;
}
int main() {
char arr[] = "AABCD";
char arr1[] = "CDAAB";
int x = 0;
printf("%s\n",arr);
printf("%s\n", arr1);
x = Judje(arr,arr1);
if (x == 1) {
printf("找到了!\n");
}
else
{
printf("没找到!\n");
}
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int find(char *dest, char *src)
{
int len = strlen(dest);
char *p = (char *)malloc(2 * len + 1);
memset(p, 0x00, 2 * len + 1);//函数memset(void *s,int ch,size_t n);将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值,
//第一个值为指定的内存地址,块的大小由第三个参数指定
strcpy(p, dest);
strcat(p, dest);//用于连接两个字符串的标准库函数
if (strstr(p, src) == NULL) //strstr是一种函数,从字符串str1中查找是否有字符串str2,
//如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。
return 0;
else
free(p);
return 1;
}
int main()
{
char arr[] = "ABCDEF";
if ((find(arr, "CDEFAB")) == 1)
printf("是子串\n");
else
printf("不是子串\n");
system("pause");
return 0;
}