题目
给定两个字符串 s 1 s_1 s1 和 s 2 s_2 s2 ,要求判定 s 2 s_2 s2 能否被通过 s 1 s_1 s1 作循环移位(rotate)得到的字符串包含。例如,给定 s 1 = AABCD s_1=\text{AABCD} s1=AABCD 和 s 2 = CDAA s_2= \text{CDAA} s2=CDAA,返回 true ;给定 s 1 = ABCD s_1=\text{ABCD} s1=ABCD 和 s 2 = ACBD s_2=\text{ACBD} s2=ACBD,返回 false。
分析
思路一 穷举循环移位后的字符串与目标字符串进行比较;
思路二 如果
s
2
s_2
s2 是
s
1
s_1
s1
s
1
s_1
s1 的字串,则
s
2
s_2
s2 可以由
s
1
s_1
s1 循环移位得到。
实现
#include <stdio.h>
#include <string.h> // C 标准库
int rotateConbine1(char* src, char *dest) {
// 穷举循环移位后的字符串
int len = strlen(src);
for (int i = 0; i < len; i++) {
char temp = src[0];
for (int j = 0; j < len - 1; j++) {
src[j] = src[j + 1];
}
src[len - 1] = temp;
if (strstr(src, dest) != NULL) {
return 1;
}
}
return 0;
}
int rotateConbine2(char* src, char* dest) {
// 如果 dest 是 srcsrc 的字串,则 dest 可以由 src 循环移位得到
int len = strlen(src);
char* temp = malloc((2 * len + 1) * sizeof(char));
int k = 0;
for (int i = 0; i < 2 * len; i++) {
temp[k++] = src[i % 5];
}
temp[k] = "\0";
if (strstr(temp, dest) != NULL) {
return 1;
}
else {
return 0;
}
}
int main()
{
char s1[6] = "ABCD";
char s2[5] = "CBDA";
if (rotateConbine1(s1, s2)) {
printf("true\n");
}
else {
printf("false\n");
}
if (rotateConbine2(s1, s2)) {
printf("true\n");
}
else {
printf("false\n");
}
return 0;
}
知识点
strstr 函数
C 库函数char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。