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的更多相关文章

  1. Symbols of String Pattern Matching

    Symbols of String Pattern Matching in Introduction to Algorithms. As it's important to be clear when ...

  2. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  3. scala pattern matching

    scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...

  4. [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 ...

  5. [Scala] Pattern Matching(模式匹配)

    Scala中的match, 比起以往使用的switch-case有著更強大的功能, 1. 傳統方法 def toYesOrNo(choice: Int): String = choice match ...

  6. pattern matching is C# 7.0

    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...

  7. C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法

    一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多 ...

  8. Zhu-Takaoka Two-dimensional Pattern Matching

    Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...

  9. 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 ...

随机推荐

  1. mysql实现IP与整形互转

  2. win7、centos7 双系统安装总结

    centos7安装过程 问题:TroubleShooting选项进入图形化界面安装才成功. win7恢复引导区 问题:安装完Centos后,win7的引导区不见了 具体恢复过程:http://www. ...

  3. 第四篇、Python文件处理

    1.文件操作 1) 文件操作流程 a. 打开文件,得到文件句柄并赋值给一个变量 b. 通过句柄对文件进行操作 c. 关闭文件 f=open('a.txt','r',encoding='utf-8') ...

  4. 关于Bootstrap的入门知识

    问:Bootstrap是什么? 答:开源的前端框架,就是一些事先写好的css.js等. 问:Bootstrap在哪儿下载? 答:官方(https://getbootstrap.com/),中文(htt ...

  5. synchronized 和reentrantlock的优缺点

    reentrantlock的优点 可以添加多个检控条件, 如果使用synchronized,则只能使用一个. 使用 reentrant locks 可以有多个wait()/notify() 队列. [ ...

  6. 【转】shell脚本执行时报"bad interpreter: Text file busy"的解决方法

    1)问题现象: 在ubuntu下执行以下脚本( while_count),报错: -bash: ./while_count: /bin/bash: bad interpreter: Text file ...

  7. Intersect交集Except差集Union并集实例

    int[] oldArray = { 1, 2, 3, 4, 5 };int[] newArray = { 2, 4, 5, 7, 8, 9 };var jiaoJi = oldArray.Inter ...

  8. iOS app审核被拒申诉

    提交申诉理由之后不需要点击“提交审核”按钮,否则按照重新提交算,需要重新排队,且申诉会不起作用.

  9. IP路由配置之---------debugging调试

    实验设备:华三设备N台加一个PC 步骤一,打开屏幕输出开关,开启控制台对系统信息的监视功能 <H3C>terminal debugging #<H3C>terminal mon ...

  10. python--第十天总结(线程、进程和协程)

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...