编程之美 - 字符串移位包含

问题描述: 两个字符串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;
}












    原文作者:zy__
    原文地址: https://blog.csdn.net/wangzhiyu1980/article/details/51879259
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞