字符串移位包含问题
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串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是错的
int k = 0; ------------------------------------------------- for (; k < b.size(); k ++ ) // 用于检查当前位置是否对应目标字串 // { 该层for循环缺省了{} if (a[j + k] != b[k]) // 出现不匹配的字符,无需继续遍历 break; // } ------------------------------------------------- if (k == b.size()) // 这里的if与上面循环内的if无关 不存在else的相关性 { // k用于记录字符匹配的长度,若匹配到与b长度一致的字符串则为目标字串 puts("true"); return 0; } -------------------------------------------------
第二个if应该也在for循环里吧,大括号应该是把两个if包括进去?
// 第二个if肯定不在 for (; k < b.size(); k ++ ) 循环内 int k = 0; for (; k < b.size(); k ++ ) { } if (k == b.size()) {} // 上面三条语句是顺序结构 // 再理解一下这三条语句的功能 /* 1. k先设置为0 2. 在循环中去匹配字符串 一旦出现不匹配的字符立即结束循环 3. 如果k不为b的长度则说明匹配不成功 上面的循环提前结束了 如果k等于b的长度则说明匹配成功 可以直接输出true */
双重循环是怎么实现的,a[(i + j) % a.size()] 里面的没看懂
int j = 0; for (; j < b.size(); j ++ ) if (a[(i + j) % a.size()] != b[j]) break; // 将循环移位转化为求模 ----------------------------------------------- a[(i + j) % a.size()] // 以样例 AABCD CDAA为例 当最外层循环遍历到AABCD中的C位置时(i = 3) 内层循环开始逐位检查是否含有目标子串CDAA [存在循环移位情况 使用求模运算处理 % a.size()] j = 0时 a[3 + 0] = 'C' = b[0] j = 1时 a[3 + 1] = 'D' = b[1] j = 2时 a[3 + 2]中的5溢出了AABCD的范围 因此使用 % a.size() 对于上面j = 0 或 1 不溢出的情况使用求模无影响 a[(3 + 1) % 5] = a[4] a[(3 + 2) % 5] = a[0] = 'A' = b[2] j = 3时 a[(3 + 3) % 5] = a[1] = 'A' = b[3] 遍历结束后j的最终值为4 表明在AABCD中匹配到了子串CDAA
看懂了!谢谢谢谢!Orz