昨天看了一篇帖子,主要是讲的老外进google前的面试经历,帖子的地址如下:http://topic.csdn.net/u/20110928/21/f4223808-d32b-4900-b2a4-3ecfc1b70719.html
其中谈到一个字符串存在性验证的题目比较有意思,这个老外用了素数的整除来进行求解,当时觉得非常有意思,算法比较巧妙,不过,今天无意中想到一个自认为更好的方法,写下来留个记录,呵呵。
题目:
假设有一个各种字母组成的字符串,还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法上讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOM
答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
解法:
我们可以把一个字符串映射到一个32位的整型数值中,映射方法为:每个字母对应整型的一个位(如果字母个数超过了整型的最大存储位数32,其实我们可以简单的把整数换成整型数组来实现),例如,
A对应0位,B对应1位,......,Z对应25位
那么,上例的字符串ABCDEFGHLMNOPQRS,我们就可以转换成00000001111111100011111111,即数字522495;
字符串DCGSRQPOM,就可以转换成00000001111101000001001100,即数字512076;
然后,2个数字进行“按位与”(&)运算,如果结果与第二个数字相同,则为true,否则,为false。
尾声:
平时经常使用Delphi的集合类型,现在想想,上面不就是一个特例吗(好像Delphi的文档中就提到过,集合类型是用位数组来实现的哦,呵呵)