题目描述:
假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2里的字母string1也都有。
如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
分析:这类型的题目做多了之后,很容易便可以想到用散列表做,算法:
- hash[26] = {0},然后扫描长的字符串,若有相应的置为1;
- 扫描短字符串的每个字符a,原来hash[a]=0,则说明长字符串没有完全包含短字符串
这样的时间复杂度为O(m+n)
代码实现:
#define Size 26
bool IsExisted(char *longStr, char *shortStr)
{
//首先判断一下,二者的长度大小是否符合要求。
char hash[Size] = {0};
for(int i = 0;*(longStr+i)!='\0';i++)
{
if(hash[*(longStr+i)-'A'] == 0)
hash[*(longStr+i)-'A'] = 1;
}
for(int i = 0;*(shortStr+i)!='\0';i++)
{
if(hash[*(shortStr+i)-'A']==0)
return false;
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
char longStr[30];
char shortStr[30];
cout<<"longStr:";
cin>>longStr;
cout<<"shortStr:";
cin>>shortStr;
if(IsExisted(longStr,shortStr))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
另外,还有一种O(M+N)的算法是用数组存储,其实原理和上面的方法是一样的,这里就不再多说了。