编程之法2----字符串的包含

编程之法2----字符串的包含
   上一章讲述了字符串的旋转,常用的为三步旋转法,这一章讲述了字符串的包含。
    题目描述:给定一长字符串a和一短字符串b。请问,如何最快地判断出短字符串b中的所有字符都是否在长字符串a中?请编写函数bool StringContain(String &a,string &b)实现此功能。
    分析与解法:初看此题,最先想到的为暴力破解。即判断短字符b中的字符是否都在长字符串a中。代码如下:
bool StringContain(string &a, string &b)
{
	for(int i=0;i<b.length();i++)
	{
		int j;
		for(j=0;(j<a.length())&&(a[j]!=b[i]);++j)
			;
		if(j>=a.length())
		{
			return false;
		}
			
	}
	return true;
}
时间复杂度为O(mn)的,那么有办法提高么?
    2.排序后轮询:可以先排序,然后再进行比较。参考代码如下:
bool StringContain(string &a, string &b)
{
	sort(a.begin(),a.end());
	sort(b.begin(),b.end());
	for(int pa=0,pb=0;pb<b.length();)
	{
		while(pa<a.length() && (a[pa]<b[pb]))
			++pa;
		if((pa>=a.length()) || (a[pa]>b[pb]))
			return false;
		++pb;
	}
	return true;
}
    3.素数相乘。开始看到这种算法,没有理解为什么字符串包含能与素数扯上关系,原来是素数可以看成字符的另一种身份,上代码:
bool StringContain(string &a, string &b)
{
	const int p[26]={2,3,5,7,11,13,17,19,23,19,31,37,41,43,47,53,59,61,
					67,71,73,79,83,89,97,101};
	int f=1;
	for(int i=0;i<a.length();i++)
	{
		int x = p[a[i]-'A'];
			f*=x;
	}
	for(int i=0;i<b.length();++i)
	{
		int x = p[b[i]-'A'];
		if(f%x)
		{
			return false;
		}
	}
	return true;
} 
到此前三部分代码理解了,这本书上还有另一种解法就是位运算,表示看不懂啊。。。





你可能感兴趣的:(编程之法2----字符串的包含)