题目:
判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = abcdef和s2 = cdefab,返回1,给定s1=abcd和s2=ACBD,返回0.
abcdef左旋一个字符得到bcdefa
abcdef左旋两个字符得到cdefab
abcdef右旋一个字符得到fabcde
abcdef右旋两个字符得到efabcd
题目分析:
根据这个题目,我们能够和字符串的左旋和右旋联系起来,如果把给定的字符串拷贝一份放在给定字符串之后,例如:给定字符串abcdef,经过拷贝后得到字符串abcdefabcdef,观察这个字符串,能够发现给定的字符串abcdef经过左、右旋的所有情况为字符串abcdefabcdef的子串,则问题转换为判断另一个字符串是否是字符串abcdefabcdef的子串。整个问题可以借助两个库函数解决,下面为具体的程序:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char arr[20] = "abcdef"; char *p = "bcdefa"; char *ret = NULL; strncat(arr, arr, strlen(arr)); ret = strstr(arr, p); if(ret != NULL) { printf("OK\n"); } else { printf("NO\n"); } system("pause"); return 0; }
下面说明一下strncat和strstr的具体功能:
strncat函数:
头文件:#inclue <string.h>
strncat()用于将n个字符追加到字符串的结尾,其原型为:
char * strncat(char *dest, const char *src, size_t n);
【参数说明】dest为目标字符串,src为源字符串,n为要追加的字符的数目。
strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部。
strncat()会将dest字符串最后的‘\0‘覆盖掉,字符追加完成后,再追加‘\0‘。
【返回值】返回字符串dest。
strstr函数:
包含文件:string.h
函数原型:extern
char *strstr(char *str1, char *str2);
【功能】找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。
【返回值】返回该位置的指针,如找不到,返回空指针。