随笔杂谈之字符串存在性验证

昨天看了一篇帖子,主要是讲的老外进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的文档中就提到过,集合类型是用位数组来实现的哦,呵呵)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值