编程之美3.1 字符串移位包含的问题

做完LeetCode 189. Rotate Array之后 想起了编程之美上也有一个类似的题目,拿过来一块重温总结一下。
题目描述:
给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位得到的字符串包含。例如给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。
解法1:
对s1做循环移位,没移动一次就判断是否包含s2,具体代码如下:
[cc lang=”C++”]
#include
#include
#include
#include
using namespace std;

//编程之美3.1判断s1移位后形成的字符串是否包括字符串s2

bool is_contained(string str1, string str2)
{
int len = str1.size();
bool flag = false;
for(int i=0; i < len; i++) { char temp = str1[len-1]; for(int index = len-1; index >0; index –)
{
str1[index] = str1[index-1];
}
str1[0] = temp;
cout << "循环移位后得到的字符串: " << str1 << endl; if(str1.find(str2) != string::npos) { flag = true; break; } } return flag; } int main() { string str1 = "AABCD"; string str2 = "CDAA"; bool flag = is_contained(str1, str2); cout << "flag:" << flag << endl; return 0; } [/cc] 解法2: 另外可以对移位后的结果进行分析。以s1=ABCD为例 ABCD->DABC->CDAB->BCDA->ABCD
假设我们把前面移走的元素保留,会发现有如下规律:
ABCD->DABCD->CDABCD->BCDABCD->ABCDABCD
由此可以看出,对s1做循环移位所得到的字符串都将是字符串s1s1的子字符串。如果s2可以由s1循环移位得到,那s2一定在s1s1上,只需要一次字符串的查找操作即可。

Tags:,

Add a Comment

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据