题目描述
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
输入
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
输出
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
样例
输入
AABCD
CDAA
ASD
ASDF
输出
yes
no
来源/分类
字符串
题解
以下是判断亲和串的 C 语言程序:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[100005], s2[100005];
int len1, len2, i, j, flag;
while (scanf("%s %s", s1, s2) == 2) { // 处理多组数据
len1 = strlen(s1);
len2 = strlen(s2);
flag = 0;
for (i = 0; i < len1; i++) {
if (s1[i] == s2[0]) { // 找到 s2 的第一个字符在 s1 中出现的位置
for (j = 0; j < len2; j++) {
if (s1[(i + j) % len1] != s2[j]) {
break; // 如果有一个字符不一样就退出
}
}
if (j == len2) { // 如果 s2 中的每个字符都在 s1 中出现了,说明 s2 是 s1 的亲和串
flag = 1;
break;
}
}
}
if (flag) {
printf("yes\n");
} else {
printf("no\n");
}
}
return 0;
}
总结
程序的核心思路是:从 s1 的每个字符开始,依次与 s2 的第一个字符匹配,如果匹配上了,就从当前位置开始往后匹配 s2 的其它字符,直到全部匹配完成。为了实现循环移位,可以使用 %
运算符来处理超出字符串长度的情况。如果最后 s2 的每个字符都在 s1 中出现了,那么 s2 就是 s1 的亲和串。