KMP string pattern matching
The function used here is from the leetcode. Details can be found in leetcode problem: Implement strStr()
The best explanation should be made in the comments, which can be understood by the leading of code.
// next[j]: the smallest valid position we need to check next when detect mismatch at jth character pattern[j]
// Here, valid position means "pattern[0, ..., next[j]-1]" are matched with "text". void getNext(char *pattern, int next[]){
int i = 0, j = -1; // If the "text[i]" fails to match "patter[0]", then we need to
// check "text[i+1]" and "patter[0]", which also means "text[i]"
// would check with "patter[-1]".
next[i] = j; // while loop 1:
while(pattern[i] != '\0){
// while loop 2:
while(j >= 0 && pattern[i] != pattern[j]){
// First, j need to be valid index, so it needs to be not less than 0.
// Then, if "pattern[i]" fails to match "pattern[j]", we can also think as
// "text[i]" fails to match "pattern[j]".
// So we need to check if "text[i]" matches with "pattern[next[j]]", as next[j]
// is the position we need to check when we fail at position j.
j = next[j];
} // After the above while loop, we can know that "text[0, ..., i]" matches
// "pattern[0, ..., j]", so we can move one more step for both "text" and "pattern".
++i; ++j; // For the new i, marked as i_new, we can determine its "next value" now!!
// As we've known that "text[0, ..., i_new - 1]" matches "pattern[0, ..., j_new - 1]",
// if we fail to match at position "text[i_new]", we can move pattern to the j_new position to
// check if "text[i_new]" matches "pattern[j_new]".
// P.S:
// Also, we can know the j_new position is the optimized position. If we can get a valid position j' (valid
// means "pattern[0, ..., j'-1]" are matched with "text") smaller
// than j_new, then we'd get "(j' - 1)" (which is valid at position j'-1) is smaller than "next[j]",
// which is contradicted to the definition of "next" table.
if(pattern[i] == pattern[j])
next[i] = next[j];
else
next[i] = j;
}
} char *strStr(char *text, char *pattern){
if(NULL == text || NULL == pattern)
return NULL;
if('\0' == pattern[0])
return text; // i is the pointer of text, j is the pointer of pattern.
int i = 0, j = 0;
char *pos = NULL;
int *next = new int[strlen(pattern) + 1]; // include the '\0' getNext(pattern, next); while(text[i] != '\0'){
// Same optimization in getNext(), that is
// if we fail at one position, we may also fail at the
// next position, which means we can continue along the "next" table
// Also, we need the index to be valid first.
while(j >= 0 && text[i] != pattern[j])
j = next[j]; // After the while loop, we can know "text[0, ..., i]" matches "pattern[0, ..., j]"
// So we need to move one more step for both "text" and "pattern".
++i; ++j; if(pattern[j] == '\0'){
pos = (text + i) - j; // The beginning position in text which corresponding to the matched pattern position.
return pos;
}
} return pos; }
KMP string pattern matching的更多相关文章
- Symbols of String Pattern Matching
Symbols of String Pattern Matching in Introduction to Algorithms. As it's important to be clear when ...
- Beginning Scala study note(5) Pattern Matching
The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...
- scala pattern matching
scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...
- [PureScript] Break up Expressions into Cases in PureScript using Simple Pattern Matching
Pattern matching in functional programming languages is a way to break up expressions into individua ...
- [Scala] Pattern Matching(模式匹配)
Scala中的match, 比起以往使用的switch-case有著更強大的功能, 1. 傳統方法 def toYesOrNo(choice: Int): String = choice match ...
- pattern matching is C# 7.0
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...
- C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法
一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多 ...
- Zhu-Takaoka Two-dimensional Pattern Matching
Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...
- TypeError: cannot use a string pattern on a bytes-like object的解决办法
#!/usr/python3 import re import urllib.request def gethtml(url): page=urllib.request.urlopen(url) ht ...
随机推荐
- mysql实现IP与整形互转
- win7、centos7 双系统安装总结
centos7安装过程 问题:TroubleShooting选项进入图形化界面安装才成功. win7恢复引导区 问题:安装完Centos后,win7的引导区不见了 具体恢复过程:http://www. ...
- 第四篇、Python文件处理
1.文件操作 1) 文件操作流程 a. 打开文件,得到文件句柄并赋值给一个变量 b. 通过句柄对文件进行操作 c. 关闭文件 f=open('a.txt','r',encoding='utf-8') ...
- 关于Bootstrap的入门知识
问:Bootstrap是什么? 答:开源的前端框架,就是一些事先写好的css.js等. 问:Bootstrap在哪儿下载? 答:官方(https://getbootstrap.com/),中文(htt ...
- synchronized 和reentrantlock的优缺点
reentrantlock的优点 可以添加多个检控条件, 如果使用synchronized,则只能使用一个. 使用 reentrant locks 可以有多个wait()/notify() 队列. [ ...
- 【转】shell脚本执行时报"bad interpreter: Text file busy"的解决方法
1)问题现象: 在ubuntu下执行以下脚本( while_count),报错: -bash: ./while_count: /bin/bash: bad interpreter: Text file ...
- Intersect交集Except差集Union并集实例
int[] oldArray = { 1, 2, 3, 4, 5 };int[] newArray = { 2, 4, 5, 7, 8, 9 };var jiaoJi = oldArray.Inter ...
- iOS app审核被拒申诉
提交申诉理由之后不需要点击“提交审核”按钮,否则按照重新提交算,需要重新排队,且申诉会不起作用.
- IP路由配置之---------debugging调试
实验设备:华三设备N台加一个PC 步骤一,打开屏幕输出开关,开启控制台对系统信息的监视功能 <H3C>terminal debugging #<H3C>terminal mon ...
- python--第十天总结(线程、进程和协程)
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...