patternmatching-kmpmatch.html

来自「经典的数据结构源代码(java 实现)」· HTML 代码 · 共 54 行

HTML
54
字号
<html><head><title>Code Fragment</title></head><body text=#000000><center></center><br><br><dl><dd><pre>  <font color=#8000a0><font color=#8000a0>public</font> </font><font color=#8000a0>static</font> <font color=#8000a0><font color=#8000a0>int</font> </font><font color=#0000ff>KMPmatch</font>(<font color=#8000a0>String</font> text, <font color=#8000a0><font color=#8000a0>String</font> </font>pattern) {    <font color=#8000a0><font color=#8000a0>int</font> </font>n = text.<font color=#0000ff>length</font>();    <font color=#8000a0><font color=#8000a0>int</font> </font>m = pattern.<font color=#0000ff>length</font>();    <font color=#8000a0>int</font>[] fail = <font color=#0000ff>computeFailFunction</font>(pattern);    <font color=#8000a0><font color=#8000a0>int</font> </font>i = 0;    <font color=#8000a0><font color=#8000a0>int</font> </font>j = 0;    <font color=#ff8000>while</font><font color=#0000ff> </font>(i &lt; n) {      <font color=#ff8000>if</font><font color=#0000ff> </font>(pattern.<font color=#0000ff>charAt</font>(j) == text.<font color=#0000ff>charAt</font>(i)) {        <font color=#ff8000>if</font><font color=#0000ff> </font>(j == m - 1)          <font color=#8000a0><font color=#ff8000>return</font> </font>i - m + 1; <font color=#ff0080>// match</font>        i++;        j++;      }      <font color=#8000a0><font color=#ff8000>else</font> </font><font color=#ff8000>if</font><font color=#0000ff> </font>(j &gt; 0)        j = fail[j - 1];      <font color=#ff8000>else</font>        i++;    }     <font color=#ff8000>return</font> -1; <font color=#ff0080>// no match</font>  }  <font color=#8000a0><font color=#8000a0>public</font> </font><font color=#8000a0>static</font> <font color=#8000a0>int</font>[] <font color=#0000ff>computeFailFunction</font>(<font color=#8000a0>String</font> pattern) {    <font color=#8000a0>int</font>[] fail = <font color=#8000a0><font color=#ff8000>new</font> </font><font color=#8000a0>int</font>[pattern.<font color=#0000ff>length</font>()];     fail[0] = 0;    <font color=#8000a0><font color=#8000a0>int</font> </font>m = pattern.<font color=#0000ff>length</font>();    <font color=#8000a0><font color=#8000a0>int</font> </font>j = 0;    <font color=#8000a0><font color=#8000a0>int</font> </font>i = 1;    <font color=#ff8000>while</font><font color=#0000ff> </font>(i &lt; m) {      <font color=#ff8000>if</font><font color=#0000ff> </font>(pattern.<font color=#0000ff>charAt</font>(j) == pattern.<font color=#0000ff>charAt</font>(i)) { <font color=#ff0080>// j + 1 characters match</font>        fail[i] = j + 1;        i++;        j++;      }      <font color=#8000a0><font color=#ff8000>else</font> </font><font color=#ff8000>if</font><font color=#0000ff> </font>(j &gt; 0) <font color=#ff0080>// j follows a matching prefix</font>        j = fail[j - 1];      <font color=#ff8000>else</font> { <font color=#ff0080>// no match</font>        fail[i] = 0;        i++;      }    }    <font color=#8000a0><font color=#ff8000>return</font> </font>fail;  }</dl></body></html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?