PHP實現KMP演算法
阿新 • • 發佈:2019-01-07
function cal_next($str)
{
$next[0] = -1;//next[0]初始化為-1
$i=0;
$j = -1;
$len=strlen($str);
while($i<$len){
if($j===-1 || $str[$i]===$str[$j]){
$i++;
$j++;
$next[$i]=$j;
}else{
$j=$next[$j];
}
}
return $next;
}
$str='ABCDABD';
$next=cal_next($str);
var_dump($next);
function search($str,$search){
$next=cal_next($search);
$i=0;
$j=0;
$lenStr=strlen($str);
$lenSearch=strlen($search);
while($i<$lenStr && $j<$lenSearch){
if($j===-1 || $str[$i]===$search [$j]){//$i 主串的不後退,移動模式串。為什麼沒有$j===0,因為如果有$j++為1,下一步是判斷$str[$i]===$search[1],跳過了$search[0]
$i++;
$j++;
}else{
$j=$next[$j];
}
}
if($j===$lenSearch){
return $i-$j;
}
return -1;
}
var_dump(search($str,'ABD'));
參考
[KMP演算法(1):如何理解KMP](https://segmentfault.com/a/1190000008575379) [字串匹配的KMP演算法](http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html) [KMP演算法最淺顯理解](https://blog.csdn.net/starstar1992/article/details/54913261)