概述
kmp算法我覺得有兩個關鍵點:1.計算模式字符串的部分匹配表(這時候,自己跟自己比較)2.匹配主串時候,主串字符只遍歷一遍,匹配時候,根據模式串的部分匹配表計算模式串應該移動的位置。kmp算法時間復雜度為O(m+n);下面我實現的算法代碼(PHP)
理論
關于kmp理論部分,這篇文章寫得好:http://kb.cnblogs.com/page/176818/。我就不再贅述了。
計算部分匹配表
function kmp_next($string){
$length = strlen($string);//獲取字符串長度
$next[0] =0;
$j =0;
$i = 1;
while($i<$length){
if($string{$j} == $string{$i}){
$j++;
$next[$i]= $j;
$i++;
}else if($j == 0){
$next[$i] =$j;
$i++;
}else{
$j=$next[$j];
}
}
return $next;
}
kmp算法
function kmp($text,$mode){
$t_length = strlen($text);
$m_length = strlen($mode);
if($t_length < $m_length){
return -1;
}
$arr = kmp_next($mode);
$j=0;$i=0;
while($i<$t_length){
if($text{$i}==$mode{$j}){
if($j < $m_length-1){
$j++;$i++;
}else{
return $i-$m_length+1;
}
}else if($j==0){
$i++;
}else{
$j=$arr[$j-1];
}
}
return -1;
}
調用
$string = 'BBC ABCDAB ABCDABCDABDE';
$mode = 'ABCDABD';
$key = kmp($string,$mode);
var_dump(kmp_next($mode));
var_dump($key);
var_dump(substr($string,$key,strlen($mode)));
結果
kmp算法