问题描述: 两个字符串s1, s2,将s1循环位移,判断s2是否被包含在其中。 例如:s1 = “ABCD” s2= “CDA” 将s1循环位移后得到BCDA,s2被包含在s1循环位移后的字符串中。
思路 1: 将s1移位一次,然后与s2比较一次。如果字符串比较长,效率很低。
思路 2:
假设保留s1移位的结果, 例如:s1 = “ABCD” 位移一次 s1 = “ABCDA” 位移二次 s1 = “ABCDAB”
位移三次 s1 = “ABCDABC”
位移四次 s1 = “ABCDABCD”
位移4次后,s1变成了 s1+s1,
利用这个特点直接判断s2是否是
s1+s1的字串。
代码:(方法2)
#include <iostream>
using namespace std;
bool find(char* src, char* dst)
{
int lens = 0, lend = 0;
char* p2src = NULL;
bool find = false;
if ((NULL == src) || (NULL == dst))
return false;
lens = strlen(src);
lend = strlen(dst);
if (lend > lens) return false;
p2src = new char[lens*2+1];
memcpy(p2src, src, lens);
memcpy(p2src+lens, src, lens);
p2src[lens*2] = '\0';
if (NULL == strstr(p2src, dst))
{
find = false;
cout << dst << " Not exist in " << src << endl;
}
else
{
find = true;
cout << dst << " exist in " << src << endl;
}
delete[] p2src;
p2src = NULL;
return find;
}
void main()
{
int i = 0;
//char* str = "ABCDE";
//char* dst = "DEAB";
char* str = "ABCDEF";
char* dst = "DEAB";
find(str, dst);
cin >> i;
}