KMP(Knuth–Morris–Pratt) Algorithm

文章 String S, 要查找的字符串 String W

重点:Get int T[] from W

用变量 c 来表示当前比较到的 W 中前面的字符,
i 表示当前要处理的 T 中的 index,
int[] T = new int[W.length];
T[0] = -1; T[1] = 0;
c=0; i=2

example:
array:    a    b    a    b    c    d    a    b    a    b    a    b
idx    :    0    1    2    3    4    5    6    7    8    9   10  11

case 1:  W[c] == W[i-1] --> T[i] = ++c; i++;
case 2:  W[c] != W[i-1] && c>0 --> c = T[c];
case 3: W[c] != W[i-1] && c==0 --> T[i] = 0; i++;

过程
array: a    b    a    b    c    d    a    b    a    b    a    b
idx    : 0    1    2    3    4    5    6    7    8    9   10  11

i: 2 3 4 5 5 6 7 8 9 10 11
case: 3 1 1 2 3 3 1 1 1 1 2
pre-c: 0 0 1 2 0 0 0 1 2 3 4
after-c: 0 1 2 0 0 0 1 2 3 4 2
比较: 0 & 0 0 & 2 1 & 3 2 & 4 0 & 4 0 & 5 0 & 6 1 & 7 2 & 8 3 & 9 4 & 10

最后 po 一段自己写的 leetcode 上 implement strStr() 的代码

 1 public class Solution {
 2     public int strStr(String haystack, String needle) {
 3         if (needle==null || needle.length()==0)
 4             return 0;
 5         int ndlen = needle.length();
 6         int hslen = haystack.length();
 7
 8         if (ndlen==1) {
 9             int i=0;
10             char c = needle.charAt(0);
11             while (i<hslen) {
12                 if (haystack.charAt(i)==c) {
13                     return i;
14                 }
15                 i++;
16             }
17             return -1;
18         }
19
20         int[] T = new int[ndlen];
21         T[0] = -1;
22         T[1] = 0;
23         int i=2, cnd=0;
24         while (i<ndlen) {
25             if (needle.charAt(cnd)==needle.charAt(i-1)) {
26                 cnd++;
27                 T[i++] = cnd;
28             } else if (cnd>0) {
29                 cnd = T[cnd];
30             } else {
31                 T[i++] = 0;
32             }
33         }
34
35         int ndidx=0, hsidx=0;
36         while (hsidx<hslen) {
37             if (haystack.charAt(hsidx)==needle.charAt(ndidx)) {
38                 hsidx++;
39                 ndidx++;
40                 if (ndidx == ndlen) {
41                     return hsidx-ndlen;
42                 }
43             } else if (T[ndidx]!=-1) {
44                 ndidx = T[ndidx];
45             } else {
46                 hsidx++;
47             }
48         }
49         return -1;
50     }
51 }
时间: 2024-10-24 19:55:46

KMP(Knuth–Morris–Pratt) Algorithm的相关文章

我所理解的 KMP(Knuth–Morris–Pratt) 算法

假设要在 haystack 中匹配 needle . 要理解 KMP 先需要理解两个概念 proper prefix 和 proper suffix,由于找到没有合适的翻译,暂时分别称真实前缀 和 真实后缀. 真实前缀(Proper prefix): 一个字符串中至少不包含一个尾部字符的前缀字符串.例如 "Snape" 的全部真实前缀是 “S”, “Sn”, “Sna”, and “Snap” . 真实后缀(Proper suffix): 一个字符串中至少不包含一个头部字符的后缀字符串

模板: 字符串模式匹配 Knuth–Morris–Pratt Algorithm

Knuth–Morris–Pratt Algorithm KMP字符串模式匹配算法 模板题 Brief Introduction To be updated Algorithm To be updated Template Code #include <cstdio> #include <cstring> #define MAXN 1000005 int n,m,cnt,next[MAXN]; char s1[MAXN],s2[MAXN]; void kmp(){ next[0]=

“浅析kmp算法”

"浅析kmp算法" By 钟桓 9月 16 2014 更新日期:9月 16 2014 文章目录 1. 暴力匹配: 2. 真前缀和真后缀,部分匹配值 3. 如何使用部分匹配值呢? 4. 寻找部分匹配值 5. 拓展 5.1. 最小覆盖字串 6. 参考资料 首先,KMP是一个字符串匹配算法,什么是字符串匹配呢?简单地说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道这个字符串里面是否有"ABCDABD":我想,你的脑海中马上就

Go语言(golang)开源项目大全

转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析器控制台用户界面加密数据处理数据结构数据库和存储开发工具分布式/网格计算文档编辑器Encodings and Character SetsGamesGISGo ImplementationsGraphics and AudioGUIs and Widget ToolkitsHardwareLangu

GO语言的开源库

Indexes and search engines These sites provide indexes and search engines for Go packages: godoc.org gowalker gosearch Sourcegraph Contributing To edit this page you must be a contributor to the go-wiki project. To get contributor access, send mail t

[转]Go语言(golang)开源项目大全

内容目录 Astronomy 构建工具 缓存 云计算 命令行选项解析器 命令行工具 压缩 配置文件解析器 控制台用户界面 加密 数据处理 数据结构 数据库和存储 开发工具 分布式/网格计算 文档 编辑器 Encodings and Character Sets Games GIS Go Implementations Graphics and Audio GUIs and Widget Toolkits Hardware Language and Linguistics 日志 机器学习 Math

KMP算法解析(转自图灵社区)

KMP算法是一个很精妙的字符串算法,个人认为这个算法十分符合编程美学:十分简洁,而又极难理解.笔者算法学的很烂,所以接触到这个算法的时候也是一头雾水,去网上看各种帖子,发现写着各种KMP算法详解的转载帖子上面基本都会附上一句:“我也看的头晕”——这种诉苦声一片的错觉仿佛人生苦旅中找到知音,让我几乎放弃了这个算法的理解,准备把它直接记在脑海里了事. 但是后来在背了忘忘了背的反复过程中发现一个真理:任何对于算法的直接记忆都是徒劳无功的,基本上忘得比记的要快.后来看到刘未鹏先生的这篇文章:知其所以然(

字符串匹配:从后缀自动机到KMP

后缀自动机(sam)上的字符串匹配 ==== 我们把相对较短的模式串构造成sam. 对于P="abcabcacab", T[1..i]的后缀,使得它是sam的最长前缀长度: T: b a b c b a b c a b c a a b c a b c a b c a c a b  c 1 1 2 3 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 5 6 7 8 9 10 4 如果最长前缀长度是|P|,则表示T[1..i]的后缀和P匹配. 内存使用 可能多个trans指针同

字符串匹配——朴素算法、KMP算法

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置.通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap.下面分析朴素搜索算法和KMP这两种方法并给出其实现.假设原字符T串长度N,子串P长度为M. 1.NAIVE-STRING-MATCHING. 朴素算法,该方法又称暴力搜索,