上一篇博文讲了字符串左旋http://t.csdn.cn/8zbRf
这篇文章将讲解判断一个字符串是不是逆序过。
目录
一、问题描述
二、设计与分析
三、代码实现
一、问题描述
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
二、设计与分析
解决这一问题要用到库函数strstr和strncat。与strcat不同,strncat可以控制传递的长度。
假设我们要看BCDAA是不是AABCD的逆序,那么请看AABCDAABCD:
你会发现AABCDAABCD里包含了所有逆序后的情况。
打开MSDN,找到strstr的文档
可以看到它的作用是
Find a substring.
即查找子字符串。
Return Value
Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.
由此可以知道,如果没有找到子字符串就返回空指针。如果找到了就会返回字符串中首次出现子串的地址。
那么就要用strncat来生成类似AABCDAABCD的字符串。
再去查找strncat的文档
可以看到strncat的格式如下:
char *strncat( char *strDest, const char *strSource, size_t count );
与strcat不同,在strcat中直接将第二个参数所指向的字符串的值添加到第一个参数所指向的字符串去掉\0的尾部,而strncat中第二个参数所指向的字符串中添加到第一个参数所指向的字符串去掉\0尾部的长度是可控的。
其中size_t count就是要传递的值的长度。
在这里一定要注意,原本放置AABCD的数组一定要足够大,能够容得下AABCDAABCD,否则程序会崩溃:
三、代码实现
#include <stdio.h>
#include <string.h>
int is_left_move(char arr1[],char arr2[])
{
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)
return 0;
strncat(arr1, arr1, len1);
if (strstr(arr1, arr2) != NULL)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret = 0;
ret = is_left_move(arr1, arr2);
if (ret == 1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}