感谢参考
按照笔记本的分类,我们应该先说题目聊算法。
题目:
假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法上讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?
举例:
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOM
答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
解题:
一:最常规的算法
a)思路
轮询字符串a的所有字母,看是否在字符串b中。算法复杂度是o(n*m)
b)代码
void match(char *a, char *b)
{
bool find = false;
for(int i = 0; i < a.length; ++i)
{
find = false;
for(int j = 0; j < b.length; ++j)
{
if(a[i] == b[j])
{
find = true;
break;
}
}
if(!find) break;
}
return find;
}
二:聪明一点的算法
a)思路
先对字符串a和字符串b排序,然后对两个字符串依次轮询。算法复杂度的话,按照快速排序的效率排序需要o(mlogm + nlogn),轮询需要o(m+n)
b)代码
/*
*/
void match(char *a, char *b)
{
//排序(升序)
quickSort(*a);
quickSort(*b);
int i,j;
//轮询
for(i =0, j = 0; i < a.length && j < b.length;)
{
if(a[i] == b[j]) {++i; ++j;}
else if(a[i] > b[j]) {++j;}
else if(a[i] < b[j]) {++i;}
}
return i == a.length? true:false;
}
三:专业人士的算法
a)思路
先将字符串b中的所有字母放入一个hashtable,然后轮询字符串a中的字母,看在hashtable中是否可以找到。
所以算法复杂度是o(m+n)
b)代码
/*
我很惊讶了已经,方法可以如此巧妙,而且都在常理之内。说明自己的差距还很大,需要多多积累,多多思考。
*/
void match(char *a, char *b)
{
int hash[26] = {0};
for(int i = 0 ; i < b.length; ++i) hash[b[i]] = 1;
for(int j = 0 ; j < a.length; ++j) if(!hash[a[j]) return false;
return true;
}
四:极客的算法
a)思路
先给b字符串中的每个字母分配一个素数,获取一个乘积;再给a字符串中的每个字母分配一个素数,获取一个乘积;最后取商,如果无余数则说明完全包含。
b)代码
/*
这个已经超出我的思考范围了
*/
void match(char *a, char *b)
{
int productA = 1, productB = 1;
int tmp[26] = {2,3,5,7,11,13,17……};
for(int i = 0; i < b.length; ++i) {productA *= tmp[b[i];}
for(int i = 0; i < a.length; ++i) {productB *= tmp[a[i];}
return productB%productA == 0? true:false;
}