1. 程式人生 > >19:字串移位包含問題(1.7程式設計基礎之字串)

19:字串移位包含問題(1.7程式設計基礎之字串)

19:字串移位包含問題

總時間限制: 1000ms 記憶體限制: 65536kB
描述
對於一個字串來說,定義一次迴圈移位操作為:將字串的第一個字元移動到末尾形成新的字串。

給定兩個字串s1和s2,要求判定其中一個字串是否是另一字串通過若干次迴圈移位後的新字串的子串。例如CDAA是由AABCD兩次移位後產生的新串BCDAA的子串,而ABCD與ACBD則不能通過多次移位來得到其中一個字串是新串的子串。

輸入
一行,包含兩個字串,中間由單個空格隔開。字串只包含字母和數字,長度不超過30。
輸出
如果一個字串是另一字串通過若干次迴圈移位產生的新串的子串,則輸出true,否則輸出false。
樣例輸入
AABCD CDAA
樣例輸出
true

分析:

感覺寫的太麻煩,一次次的迴圈判斷,後來發現可以將s1字串重複兩遍放在一個字串裡面,然後就相當於所有的迴圈的情況了。

#include <iostream>
#include<string.h>
using namespace std;
//http://noi.openjudge.cn/ch0107/19/
//注意判斷長短的問題 
char a[40],b[40],c[40];
char s1[40],s2[40];
int len1,len2;
int main(int argc, char *argv[]) {
    while(cin>>a>>b){
        len1=strlen
(a); len2=strlen(b); if(len1>=len2){ for(int i=0;i<len1;i++){ s1[i]=a[i]; } for(int i=0;i<len2;i++){ s2[i]=b[i]; } s1[len1]='\0';s2[len2]='\0'; } else{ for(int
i=0;i<len1;i++){ s2[i]=a[i]; } for(int i=0;i<len2;i++){ s1[i]=b[i]; } s1[len2]='\0';s2[len1]='\0'; } int k=max(len1,len2),l=k,flag=0; while(k--){ //cout<<s1<<endl; int j=0; for(int i=1;i<l;i++){ c[j++]=s1[i]; } c[j++]=s1[0]; c[j++]='\0'; if(strstr(c,s2)){ cout<<"true"<<endl; flag=1; break; } for(int i=0;i<j;i++){ s1[i]=c[i]; } } if(flag==0){ cout<<"false"<<endl; } } return 0; }