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

問題描述:
兩個字符串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;
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章