字符串查找算法之(一)KMP算法
来源:互联网 发布:linux 获取cpu信息 编辑:程序博客网 时间:2024/06/04 19:40
问题:查找Text中是否含有Pattern字符串,返回Pattern在Text中的位置。
#include <string.h>#include <iostream>using namespace std;// init the prefix array. when comparing, if text[i] != pattern[j], // then pattern[prefix[j]] should be next check point of pattern against text[i].//// say y = prefix[j], y stands for the biggest length of the word pattern[0..(y-1)]// that makes (pattern[0..(y-1)] == pattern[(j-y+1)..j]). // In another word, y stand for the next comparation point of pattern.// (y==0) means no such word, the next comparation should shart from pattern[0].// Note: it's possible that 0<y<(i-y)<j and 0<(i-y)<y<j.//// When comparing, if (text[i] != pattern[j]) then j = prefix[j-1], // then compare again with text[i] until (j==0)//void InitPrefix(const char *pattern, int prefix[]) { int len = strlen(pattern); prefix[0] = 0; for (int i = 1; i < len; i++) { int k = prefix[i - 1]; while ((k > 0) && (pattern[i] != pattern[k])) { k = prefix[k - 1]; } if (pattern[i] == pattern[k]) { prefix[i] = k + 1; } else { prefix[i]=0; } } return; }int StrStr(const char* text, const char* pattern) { if (!text || !pattern || pattern[0] == '/0' || text[0] == '/0') { return -1; } int lenText = strlen(text); int lenPattern = strlen(pattern); if (lenText < lenPattern) { return -1; } int *prefix = new int[lenPattern + 1]; InitPrefix(pattern, prefix); //the prefix array of pattern int index = -1; // the index to be returned. int i = 0; // the compare index in text. int j = 0; // the compare index in pattern while ((text[i] != '/0') && ((lenText - i) >= (lenPattern - j))) { if (pattern[j] == text[i]) { //reach the end of pattern, find match! return. if (pattern[j+1] == '/0') { index = i - lenPattern + 1; break; } // compare next char in pattern and text. j++; i++; } else { if (j == 0) { // pattern[0] != text[i], then skip to text[i+1]. i++; } else { //pattern[j]!= text[i], the next check point should be pattern[prefix[j-1]] j = prefix[j-1]; } } } delete []prefix; prefix=0; return index; }
- 字符串查找算法之(一)KMP算法
- 查找字符串之 KMP算法
- KMP算法查找字符串
- KMP字符串查找算法
- KMP字符串查找算法
- 字符串查找算法-KMP
- KMP - 字符串查找算法
- 字符串查找算法kmp
- 字符串查找算法kmp
- KMP字符串查找算法
- KMP字符串查找算法
- 【算法之字符串(一)】KMP算法详解之下
- 【算法之字符串(一)】KMP算法详解之上:适合初学KMP算法的朋友
- 字符串查找(KMP算法及其优化)
- KMP子字符串查找算法
- 字符串的查找--KMP算法
- 字符串查找(2)KMP算法
- 字符串匹配查找算法-KMP
- Upgrading Oracle JInitiator with Oracle E-Business Suite 11i
- 通过经纬度计算地球两点间的距离
- WebRequest 模拟请求登录 终于搞定了!
- c#中textbox只能输入数字, 包括小数
- 【编程语言】Android--如何创建sdcard,向sdcard里面传送图片,更改sd卡权限
- 字符串查找算法之(一)KMP算法
- TMX Map Format
- Crystal Reports 2008 安装错误处理
- 中文路径问题
- JAVA读取文件,避免中文乱码
- JAVA读取文件,避免中文乱码
- svn status-显示工作副本中目录与文件的状态
- WCF技术的不同应用场景及其实现分析(续)
- orcad 小问题两个(annotate 标号重复和显示GND的方法)