//字符串算法
//题目:
//给定两个字符串 s1 和 s2,判断 s2 是否是 s1 的旋转字符串
// (即将 s1 的任意部分移到字符串的末尾形成的字符串)。
//
//问题函数定义:
//
//cpp
//bool isRotatedString(string s1, string s2);
//裁判测试程序样例:
//
//cpp
#include <iostream>
#include <string>
using namespace std;
// 请在这里实现 isRotatedString 函数
//在 s1 中找到与 s2 的第一个字符相同的位置,然后检查从这个位置开始到结尾的字符是否与 s2相同。如果是,则返回 true,否则继续寻找下一个可能的起始位置。
bool isRotatedString(string s1, string s2) {
int n1 = s1.size();
int n2 = s2.size();
if (n1 != n2)
return false;
if (n1 == 0)
return true;
int l = 0;
int r = n1 - 1;
for (int i = 0; i < n1; i++) {
if (s1[i] == s2[0]) {
if (n1 == 1)
return true;
for (int j = 1; j < n1; j++) {
if (s2[j] != s1[(i + j)%n1])
break;
if (j == n1 - 1)
return true;
}
}
}
return false;
}
int main() {
string s1 = "waterbottle";
string s2 = "erbottlewat";
if (isRotatedString(s1, s2)) {
cout << "s2 是 s1 的旋转字符串。" << endl;
}
else {
cout << "s2 不是 s1 的旋转字符串。" << endl;
}
return 0;
}
//输入样例:
//
//s1 = "waterbottle"
//s2 = "erbottlewat"
//输出样例:
//
//s2 是 s1 的旋转字符串。
//将 s1 重复一次,然后在这个新字符串中查找 s2。如果 s2 是 s1 的旋转字符串,那么 s2 一定是 s1 + s1 的子字符串
bool isSubstring(const string& s1, const string& s2) {
return s1.find(s2) != string::npos;
}
bool isRotatedString(const string& s1, const string& s2) {
if (s1.size() != s2.size())
return false;
if (s1.empty())
return true;
string s1s1 = s1 + s1;
return isSubstring(s1s1, s2);
}