问题描述
给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。
样例输入
AABCD CDAA
ABCD ACBD
样例输出
true
false
代码
#include <stdio.h>
#include <string.h>
bool search(char* src, char* des, int startIndex);
int main(int argc, char** argv) {
char src[100];
char des[100];
while(scanf("%s %s",src,des) != EOF)
{
int len = strlen(src);
int index = 0;
for(; index < len; ++index)
{
if (src[index] == des[0])
{
bool success = search(src, des, index);
if (success){
printf("true
");
break;
}
}
}
if (index == len)
{
printf("false
");
}
}
return 0;
}
bool search(char* src, char* des, int startIndex)
{
int srcLen = strlen(src);
int desLen = strlen(des);
int index = 0;
for(; index < desLen; ++index)
{
if (src[startIndex] == des[index])
{
++startIndex;
startIndex %= srcLen;
} else {
break;
}
}
return index == desLen;
}
思路及代码说明
-
startIndex %= srcLen;
涉及到循环移动的地方,总能想起操作系统中“生产者——消费者”的模式。这种通过取余回到队列前端的方法,在逻辑上就像是将队列首尾相接。 -
if (src[index] == des[0])
用于加速。因为对 search 函数的封装,导致每次进入都要调用两次 strlen() 。减少对 search() 的调用应该能省那么一点点时间吧。 -
与那种复制一份 source 接到原来的 source 后面,并调用 strstr() 函数来判断是否包含的方法比起来,比较省空间。
与那种真正将 src 数组循环移位的方法比起来,比较省时间。