题目描述

人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题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 的亲和串。

OJ刷题之旅_#include