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 < 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 > 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 < 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 > 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 + -
显示快捷键?