HDU 2203 字符串匹配題目
點擊打開鏈接
Problem Description
親和串的定義是這樣的:給定兩個字符串s1和s2,如果能通過s1循環移位,使s2包含在s1中,那麼我們就說s2 是s1的親和串。
Input
Output
Sample Input
Sample Output
題目分析:這道題目首先要理解字符串的循環移位是什麼意思,我們假定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;
}