【例题2】移位包含
【例题2】移位包含
题面
题目描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 \(s1\) 和 \(s2\),要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如 CDAA
是由 AABCD
两次移位后产生的新串 BCDAA
的子串,而 ABCD
与 ACBD
则不能通过多次移位使得其中一个字符串是新串的子串。
输入格式
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true
,否则输出 false
。
样例
样例输入
AABCD CDAA
样例输出
true
数据范围与提示
对于 \(100\%\) 的数据,\(1\le length(s1),length(s2)\le 30\)。
分析
- 注意到题面所说的
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
- 这意味着什么,一个字符从字符串的头移到尾?
- 这不就是说如果字符串 \(s2\) 在字符串 \(s1+s1\) 中就说明成立吗?
- 为什么?
- 因为将一个字符从字符串的头移到尾的话,将 \(s1\) 中 \(length(s1)\) 个字符进行移位操作,那么得到的新字符串还是 \(s1\)。
- 那么也就是意味着 \(s1\) 是 \(s1+s1\) 中长度为 \(length(s1)\) 的字符串。
- 因此,我们只需要判断 \(s2\) 是否是 \(s1+s1\) 的子串。
字符串的find()函数可以查找另一个字符串是否为该字符串的子串,
若是,返回另一个字符串的第一个字符在该字符串中的位置
若不是,返回该字符串的npos(一个极大的数)
Code
#include <bits/stdc++.h>
using namespace std;
string s1, s2;
int main(void) {
cin >> s1 >> s2;
s1 += s1;
if (s1.find(s2) != s1.npos)
puts("true");
else
puts("false");
return 0;
}