字符串移位包含问题
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式
共一行,包含两个字符串,中间由单个空格隔开。
字符串只包含字母和数字,长度不超过30。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
输入样例:
AABCD CDAA
输出样例:
true
常规做法 [Y总做法]
#include <iostream>
using namespace std;
int main()
{
string a, b;
cin >> a >> b;
if (a.size() < b.size()) swap(a, b); //swap可以交换任意类型变量
for (int i = 0; i < a.size(); i ++ ) //对每种循环移位结果进行遍历
{
a = a.substr(1) + a[0]; // 循环移位一位
for (int j = 0; j + b.size() <= a.size(); j ++ ) // 注意范围
{
int k = 0;
for (; k < b.size(); k ++ ) //注意k不要重复定义
if (a[j + k] != b[k])
break;
if (k == b.size())
{
puts("true");
return 0;
}
}
}
puts("false");
return 0;
}
两重循环做法,简化循环移位操作
#include <iostream>
using namespace std;
int main()
{
string a, b;
cin >> a >> b;
if (a.size() < b.size()) swap(a, b);
for (int i = 0; i < a.size(); i ++ )
{
int j = 0;
for (; j < b.size(); j ++ )
if (a[(i + j) % a.size()] != b[j]) break;
// 将循环移位转化为求模
if (j == b.size())
{
puts("true");
return 0;
}
}
puts("false");
return 0;
}
j + b.size() <= a.size()这个是为什么呀?
为什么最里面两个if中第二个if前加else是错的
第二个if应该也在for循环里吧,大括号应该是把两个if包括进去?
双重循环是怎么实现的,a[(i + j) % a.size()] 里面的没看懂
看懂了!谢谢谢谢!Orz