19:字符串移位包含问题(1.7编程基础之字符串)

来源:互联网 发布:js获取当前日期时间 编辑:程序博客网 时间:2024/05/18 02:42

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;}
阅读全文
0 0