patternmatching-bmmatch.html
来自「经典的数据结构源代码(java 实现)」· HTML 代码 · 共 50 行
HTML
50 行
<html><head><title>Code Fragment</title></head><body text=#000000><center></center><br><br><dl><dd><pre> <font color=#ff0080>/** Simplified version of the Boyer-Moore (BM) algorithm, which uses * only the looking-glass and character-jump heuristics. * @return Index of the beginning of the leftmost substring of the text * matching the pattern, or -1 if there is no match. */</font> <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>BMmatch </font>(<font color=#8000a0>String</font> text, <font color=#8000a0><font color=#8000a0>String</font> </font>pattern) { <font color=#8000a0>int</font>[] last = <font color=#0000ff>buildLastFunction</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><font color=#8000a0>int</font> </font>i = m -1; <font color=#ff8000>if</font><font color=#0000ff> </font>(i > n - 1) <font color=#ff8000>return</font> -1; <font color=#ff0080>// no match if pattern is longer than text</font> <font color=#8000a0><font color=#8000a0>int</font> </font>j = m - 1; <font color=#ff8000>do</font> { <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 == 0) <font color=#8000a0><font color=#ff8000>return</font> </font>i; <font color=#ff0080>// match</font> <font color=#ff8000>else</font> { <font color=#ff0080>// looking-glass heuristic: proceed right-to-left</font> i--; j--; } <font color=#ff8000>else</font> { <font color=#ff0080>// character jump heuristic</font> i = i + m - Math.<font color=#0000ff>min</font>(j, 1 + last[text.<font color=#0000ff>charAt</font>(i)]); j = m - 1; } } <font color=#ff8000>while</font><font color=#0000ff> </font>(i <= n - 1); <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>buildLastFunction </font>(<font color=#8000a0>String</font> pattern) { <font color=#8000a0>int</font>[] last = <font color=#8000a0><font color=#ff8000>new</font> </font><font color=#8000a0>int</font>[128]; <font color=#ff0080>// assume ASCII character set</font> <font color=#ff8000>for</font><font color=#0000ff> </font>(<font color=#8000a0>int</font> i = 0; i < 128; i++) { last[i] = -1; <font color=#ff0080>// initialize array</font> } <font color=#ff8000>for</font><font color=#0000ff> </font>(<font color=#8000a0>int</font> i = 0; i < pattern.<font color=#0000ff>length</font>(); i++) { last[pattern.<font color=#0000ff>charAt</font>(i)] = i; <font color=#ff0080>// implicit cast to integer ASCII code</font> } <font color=#8000a0><font color=#ff8000>return</font> </font>last; }</dl></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?