强大的和谐
来源:互联网 发布:超频稳定性测试软件 编辑:程序博客网 时间:2024/05/01 07:46
http://blog.csdn.net/hackbuteer1/article/details/6725287
实现一个挺高级的字符匹配算法:
给一串很长字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3 这些都要找出来,其实就是类似一些和谐系统。。。。。
这题的真正意思就是,给你一个目标串,如“123”,只要一个字符串里面同时包含1、2和3,那么这个字符串就匹配了。系统越和谐,说明错杀的可能行也就越大。加入目标串的长度为m,模式串的长度为n,我们很容易想到O(mn)的算法,就是两遍for循环搞定。那么有没有更快的方法呢?
我们考虑问题的时候,如果想时间变得快,有一种方法就叫做“空间换时间”。哈希表是一种比较复杂的数据结构。由于比较复杂,STL中没有实现哈希表,因此需要我们自己实现一个。但由于本题的特殊性,我们只需要一个非常简单的哈希表就能满足要求。由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的0、1对应每个字符是否出现。这样我们就创建了一个大小为256,以字符ASCII码为键值的哈希表。(并不仅限于英文字符,所以这里要考虑256种可能)。
知道了这点,我们可以构建一个数组来统计模式串中某个字符是否出现,然后在对目标串进行扫描,看看对应的所有位上是否出现,从而判断是否匹配。分析一下复杂度,大概是O(m+n)。
实现代码如下:
//强大的和谐系统int is_contain(char *src, char *des){//创建一个哈希表,并初始化const int tableSize = 256;int hashTable[tableSize];int len,i;for(i = 0; i < tableSize; i++)hashTable[i] = 0;len = strlen(src);for(i = 0; i < len; i++)hashTable[src[i]] = 1;len = strlen(des);for(i = 0; i < len; i++){if(hashTable[des[i]] == 0)return 0; //匹配失败}return 1; //匹配成功}
int main(){if(is_contain("miaolinjie","jiemiao"))cout<<"和谐"<<endl;elsecout<<"不和谐"<<endl;return 0;}
- 强大的和谐
- 强大的和谐系统
- 强大的和谐--高级的字符匹配算法
- 程序员面试100题之十四:强大的和谐
- 程序员面试100题之十四:强大的和谐
- 程序员面试100题之十四:强大的和谐
- 程序员面试100题之十四:强大的和谐
- 网络时代的和谐隐患
- 和谐的一家人
- 最不和谐的装饰
- 和谐的心
- 和谐的心
- 和谐
- 和谐
- 和谐
- 和谐
- Chrome 被和谐的解决办法
- 夫妻性生活和谐的秘诀
- GraphicsView框架简介(zz)
- com.bea.xml.XmlException: failed to load java type corresponding to e=web-app@ h
- Mysql的Root密码忘记,查看或修改的解决方法
- VS2005(vs2008,vs2010)使用map文件查找程序崩溃原因
- Java命令行参数输入问题
- 强大的和谐
- 大数据量的过滤 (用于爬虫,蜘蛛) Bloom Filter 布隆过滤器
- (iPhone/iPad)代码调用“设置”中相关功能设置
- 串口转以太网模块:WIZ108SR(用户手册)
- warning: the 'gets' function is dangerous and should not be used.的解决办法
- 怎样清理xp系统垃圾
- RTSP 协议分析
- 更简洁的 CSS 清理浮动方式
- 局部变量、全局变量、堆、堆栈、静态和全局(转)