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 &gt; 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 &lt;= 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 &lt; 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 &lt; 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 + -
显示快捷键?