NOI1.7.19字符串移位包含问题 题解(C++)
今天的这一道题非常的简(可)单(怕),作者在题目中已经错了七八回了,我太难了
请听题:
19:字符串移位包含问题
总时间限制: 1000ms
内存限制: 65536kB
描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
输入
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
输出
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
样例输入
AABCD CDAA
样例输出
true
扫描二维码关注公众号,回复:
9463350 查看本文章
记住,作为一个刷题者,一定要记住先看题,不要立刻操键盘码题,好好看看题目吧。因为长度不大,可以写出一种暴力模拟的代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[35]={0};
char need[35]={0};
cin>>a>>need;
int len = strlen(a);
int lenneed = strlen(need);
if(lenneed>len){
//不要着急false
char q[35];
strcpy(q,a);
strcpy(a,need);
strcpy(need,q);//交换a和need
swap(len,lenneed);//如果交换了,一定长度也要交换
}
for(int i = 0;i<len;i++){//移位len次,移动len+1次就会回到原来的数组
for(int j = 0;j<=len-lenneed;j++){//以j为开始找need
bool find = true;//默认为找到了
for(int k = 0;k<lenneed;k++){
if(need[k]!=a[j+k]){//不一样
find = false;//没找到
break;
}
}
if(find){//find没有变动,即完全相等
cout<<"true";
return 0;
}
}
char p = a[0];
for(int j = 1;j<=len-1;j++){
a[j-1] = a[j];
}
a[len-1] = p;//移位
}
cout<<"false";
return 0;
}
是不是相当暴力,呵呵~~~
本题的讲解到此结束。