一个关于字符串匹配的算法题目
2014-07-13 20:13
323 查看
有这样一个算法题目
假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,
什么方法能最快的查出所有短字符串里的字母在长字符串里都有?
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOM
答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
立刻能想到的就是遍历了,然后进一步思考得到以后的几种方法,
方法一;将短字符串中每个字符在长字符串中遍历,时间复杂度为O(m*n)
方法二;设置一个哈希表,对长字符串的字符遍历,将每个字符对应的哈希表中的值设为1。然后对短字符进行遍历,
如果所有字符对应的哈希值都为1,则返回true,否则返回false。这样时间复杂度就是O(m+n).
方法三;我们可以观察到,字母总共就有26个,hash表的值只有1和0两种情况,我们知道int类型是32位,如果用1位(bit)来表示一个字母是否出现,
那么只需1个int类型就能够表示所有的字母了。将长字符串中每个字符的哈希值在相应的位中设为1,短字符串遍历同方法二。
方法四;是比较独特奇妙的,我们为每个字母(假设字母的数量是一定的)分配一个不重复素数,比如a为2, b为3, c为5,以此类推。
这样在对字符串A进行遍历时,将每个字符表示的素数相乘,最终得到一个比较大的整数。然后从字符串B中第一个字母开始,
用每个字母所代表的数除这个整数,如果余数不为0,那么就返回false。如果整个遍历过程中都没有余数,则返回true。
第四种方法给人眼前一亮的感觉,比较新颖奇特,效率也不一定比第三种优,但是这启发我们在学习算法的时候多去从多方面考虑,同时也要打好数学基础。
这个面试题来自一个有趣的故事,原故事参加http://www.vaikan.com/google-interviewing-story/
假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,
什么方法能最快的查出所有短字符串里的字母在长字符串里都有?
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOM
答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPOZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
立刻能想到的就是遍历了,然后进一步思考得到以后的几种方法,
方法一;将短字符串中每个字符在长字符串中遍历,时间复杂度为O(m*n)
方法二;设置一个哈希表,对长字符串的字符遍历,将每个字符对应的哈希表中的值设为1。然后对短字符进行遍历,
如果所有字符对应的哈希值都为1,则返回true,否则返回false。这样时间复杂度就是O(m+n).
方法三;我们可以观察到,字母总共就有26个,hash表的值只有1和0两种情况,我们知道int类型是32位,如果用1位(bit)来表示一个字母是否出现,
那么只需1个int类型就能够表示所有的字母了。将长字符串中每个字符的哈希值在相应的位中设为1,短字符串遍历同方法二。
方法四;是比较独特奇妙的,我们为每个字母(假设字母的数量是一定的)分配一个不重复素数,比如a为2, b为3, c为5,以此类推。
这样在对字符串A进行遍历时,将每个字符表示的素数相乘,最终得到一个比较大的整数。然后从字符串B中第一个字母开始,
用每个字母所代表的数除这个整数,如果余数不为0,那么就返回false。如果整个遍历过程中都没有余数,则返回true。
第四种方法给人眼前一亮的感觉,比较新颖奇特,效率也不一定比第三种优,但是这启发我们在学习算法的时候多去从多方面考虑,同时也要打好数学基础。
这个面试题来自一个有趣的故事,原故事参加http://www.vaikan.com/google-interviewing-story/
相关文章推荐
- 关于字符串匹配(单模式匹配)的各种算法
- 3月24日 想到了一个字符串匹配的新算法 程序 时间复杂度自己不会算
- 这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
- 一个自己研究出来的字符串匹配算法-k子串算法
- 关于字符串匹配的算法(%%%)
- C语言中的一个关于求正方形个数的算法题目
- 【总结】关于字符串匹配算法研究
- 关于字符串匹配算法的survey
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
- 关于线性字符串匹配的算法-----KMP的算法
- 经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)
- 经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)
- 转载: 一篇关于字符串匹配的(KMP)算法_图文并茂
- 关于算法--蛮力法--字符与字符串匹配
- 关于字符串匹配算法研究 http://www.cnblogs.com/Su-30MKK/archive/2012/09/17/2688122.html
- C语言中的一个关于求正方形个数的算法题目
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
- 腾讯2017年实习生编程题目(第二题)----2.算法基础-字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
- 关于字符串匹配的算法(一)
- 关于自然数的一个题目