1.题目
判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
2.程序代码
方法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>
int judge_char(const char arr1[7], char arr2[7], int sz)//定义函数,达到题目要求
{
int i = 0;
int j = 0;//定义参数,控制循环次数
char mid = 0;//定义参数,作为中间量
if (strcmp(arr1, arr2) == 0)//strcmp是比较两字符串内容的函数
//相等返回0,左边大返回正数,右边大返回负数
{
return 1;
}
while (j < sz)//循环次数不能超过字符串长度
{
i = 0;//每次循环都要给i初始化
mid = arr2[0];
while (i < sz - 1)
{
arr2[i] = arr2[i + 1];
i++;
}
arr2[sz - 1] = mid;//把元素整体向左移动,第一个元素放到最后
if (strcmp(arr1, arr2) == 0)
{
return 1;
}
j++;
}
return 0;
}
int main()
{
char s1[] = "ABCDEF";//定义字符串
char s2[7] = { 0 };
int sz = sizeof(s1) / sizeof(s1[0]) - 1;//计算字符串的长度,
//字符串中隐藏着一个“\0”,所以计算出来的数要减去1才是字符串中元素的个数
printf("please input a string(include 6 character):");
scanf("%s", &s2);
printf("%d\n", judge_char(s1, s2, sz));
system("pause");
return 0;
}
方法二:
//该方法所用的思想为把一个字符串拷贝之后拼接到后面形成如下形式:
//ABCDEFABCDEF 若另一个字符串为原字符串旋转后得到的 那么这个字符串一定是这个
//拼接后的字符串的子串
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
#define N 7
int judge_char(char *s1, char *s2)//
{
char *p = malloc(strlen(s1) + strlen(s1) + 1);//开辟动态内存空间,两个
//字符串的长度加上一个'\0'的长度
strcpy(p, s1);//把字符串s1的内容拷贝到p
strcat(p, s1);//把字符串p与s1拼接到一起
//printf("p = %s\n", p);
if (strstr(p, s2) == NULL)//strstr函数是判断后者是否为前者的子串,
//若不是返回NULL
{
return 0;
}
return 1;
}
int main()
{
char s1[N] = "ABCDEF";
char s2[N] = { 0 };//定义两个字符串
printf("please input a character string(include 6 character):");
scanf("%s", &s2);
printf("%d", judge_char(s1, s2));
system("pause");
}