字符串查找问题
2014-10-21 20:47
155 查看
原问题与解答是在网上看到的,但是忘记网址了,这里自己重新大概说一遍。
假设字符串 A: abcjsjdefsg
字符串B : bkbgdsgs
如何判断字符串B的每个字符在A中是否都出现?
像上面的话,由于B的k字符不在A串内,所以是肯定不行的,所以就返回false
如果B是bsbgdsgs的话,那么B的所有字符都在A里面可以找到,那么就返回True了
这里有比较传统的做法,第一个做法是哈希的做法
对A中的字符串的每个字符都进行哈希等到整数值,然后B中的也这样做,这样就可以判断是否找到了,这样的时间复杂度是O(m+n)
另外一种做法是素数的方法
将A中的每个不同字符都对应一个素数,然后将A中的每个字符对应的素数相乘,这样就得到一个整数,然后再用这个整数去除B中的每个字符对应的素数,然后出现余数了,那么就可以返回False了,如果到底也没有余数,那么就返回True了,这样的复杂度是时间O(m+n)
还有一种做法,但是前提是字符都是ascii值
申请256个bit,然后对应每个A中的每个字符都是可以映射到一个bit,将其置1.例如'a'的ascii值就是96,那么在96这个位置上将其置1,相同的可以不管。到B时就可以对其每个字符进行判断了,这样的时间复杂度也是O(m+n),但是占用的空间就是O(1)了。
这种方法是有字符大小的限制的, 或者也可以申请为unicode的范围大小,对于字符串先转为unicode的值,然后再利用上面的匹配,这样应该也是可以的,而且就不用考虑字符串里面字符的限制了。
假设字符串 A: abcjsjdefsg
字符串B : bkbgdsgs
如何判断字符串B的每个字符在A中是否都出现?
像上面的话,由于B的k字符不在A串内,所以是肯定不行的,所以就返回false
如果B是bsbgdsgs的话,那么B的所有字符都在A里面可以找到,那么就返回True了
这里有比较传统的做法,第一个做法是哈希的做法
对A中的字符串的每个字符都进行哈希等到整数值,然后B中的也这样做,这样就可以判断是否找到了,这样的时间复杂度是O(m+n)
另外一种做法是素数的方法
将A中的每个不同字符都对应一个素数,然后将A中的每个字符对应的素数相乘,这样就得到一个整数,然后再用这个整数去除B中的每个字符对应的素数,然后出现余数了,那么就可以返回False了,如果到底也没有余数,那么就返回True了,这样的复杂度是时间O(m+n)
还有一种做法,但是前提是字符都是ascii值
申请256个bit,然后对应每个A中的每个字符都是可以映射到一个bit,将其置1.例如'a'的ascii值就是96,那么在96这个位置上将其置1,相同的可以不管。到B时就可以对其每个字符进行判断了,这样的时间复杂度也是O(m+n),但是占用的空间就是O(1)了。
这种方法是有字符大小的限制的, 或者也可以申请为unicode的范围大小,对于字符串先转为unicode的值,然后再利用上面的匹配,这样应该也是可以的,而且就不用考虑字符串里面字符的限制了。
相关文章推荐
- 从给定的文本中,查找其中最长的重复子字符串的问题
- 从给定的文本中,查找其中最长的重复子字符串的问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 查找字符串中的最长回文问题评述
- 字符串查找最大值问题
- 字符串查找匹配问题
- C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 面试中的一个小问题(字符串查找)
- 字符串问题---在有序但含有空的数组中查找字符串
- qt & qt creator 中文字符串查找问题
- (转)从给定的文本中,查找其中最长的重复子字符串的问题
- linux下查找字符串&mysql-为magento性能测试修改innodb的innodb_buffer_pool_size而引发的问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 博客笔记 字符串是否包含及匹配/查找/转换/拷贝问题
- 经典考题——无重复字符问题(查找字符串中第一个无重复字符)
- 经典考题——无重复字符问题(查找字符串中第一个无重复字符)
- 有关字符串查找的问题
- QT4/QT5中实现查找功能时中文字符串转换问题
- C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串