HDU 2203 親和串 小白題解(字符串查找)

HDU 2203 字符串匹配題目   點擊打開鏈接

Problem Description

人隨着歲數的增長是越大越聰明還是越大越笨,這是一個值得全世界科學家思考的問題,同樣的問題Eddy也一直在思考,因爲他在很小的時候就知道親和串如何判斷了,但是發現,現在長大了卻不知道怎麼去判斷親和串了,於是他只好又再一次來請教聰明且樂於助人的你來解決這個問題。
親和串的定義是這樣的:給定兩個字符串s1和s2,如果能通過s1循環移位,使s2包含在s1中,那麼我們就說s2 是s1的親和串。

Input

本題有多組測試數據,每組數據的第一行包含輸入字符串s1,第二行包含輸入字符串s2,s1與s2的長度均小於100000。

Output

如果s2是s1的親和串,則輸出"yes",反之,輸出"no"。每組測試的輸出佔一行。

Sample Input

AABCD CDAA ASD ASDF

Sample Output

yes no

如果s2是s1的親和串,則輸出"yes",反之,輸出"no"。每組測試的輸出佔一行。

題目分析:這道題目首先要理解字符串的循環移位是什麼意思,我們假定s1爲abcdefg,那麼這個字符串循環左移1位的結果就是bcdefga(將每個字母左移1位,a這個字母到最後的位置),右移3位的結果就是defgabc,以此類推。下一步,題目要求用循環移位的方式變換s1,我們仍然假設s1爲abcdefg,那麼循環移位的結果是bcdefga,cdefgab,defgabc,efgabcd,fgabcde,gabcdef,abcdefg。我們將s1重複連接,得到s3:abcdefgabcdefg,不難證明,如果 s2在s3中,那麼s2一定也在s1變換後的幾個字符串中,如果s2不在s3中,那麼s2一定也不在s1變換後的幾個字符串中。因此我們只需要在s3中去查找s2即可。

這裏我們可以使用KMP算法模板,但由於題目只要求輸出能否找到s2,因此我們用strstr()函數是最合適不過的。不難想到想到,這個代碼非常簡單,strcpy(),strcat(),strstr()的完美配合。前兩個函數用於得到s3,後面一個函數實現查找即可。

好啦,下面是AC代碼。

#include<cstdio>
#include<cstring>
char s1[100005],s2[100005],s3[200010];
int main()
{
    while(~scanf("%s",s1))
    {
        scanf("%s",s2);
        strcpy(s3,s1);
        strcat(s3,s1);
        if(strstr(s3,s2)!=NULL)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章