首页 > 编程语言 > 详细

php实现kmp算法

时间:2017-12-30 15:26:13      阅读:204      评论:0      收藏:0      [点我收藏+]

kmp是一种高效的字符串查找匹配算法,不懂的同学可先移步至:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html。

下面给出具体代码实现。

//abca
//前缀:a,ab,abc 
//后缀:bca,bc,a  重复的是‘a‘,因此权值为1
//abcab
//前缀:a,ab,abc,abca
//后缀:bcab,cab,ab,b 重复的是‘ab‘,因此权值为2
//权值算法
$pattern=‘ABCDABD‘;
$front=$end=‘‘;    
$str=strlen($pattern);
$first=$pattern[0];
$next[]=0;
for($k=1;$k<$str;$k++){ //第一个循环,对字符串‘ABCDABD‘本身进行拆分成A,AB,ABC等
    $next[]=0; //权值默认为0,如果匹配出了长度,则修改。
    $front=$end=$head=$tail=null; 
    $first.=$pattern[$k];
    $long=strlen($first);
    for($i=0;$i<$long-1;$i++){ //这里对拆分成的字符串再进行首尾拆分,例如ABC拆分成前缀A,AB,后缀,BC,C
        $front.=$first[$i];
        $end=$first[$long-$i-1].$end; 
        $head[]=$front;
        $tail[]=$end;
    }
    $len=null; //权值
    for($i=0;$i<count($head);$i++){ //这里是对拆分后的前缀和后缀进行比较
        for($j=0;$j<count($tail);$j++){
            if($head[$i]==$tail[$j]){
                !$len?$len=strlen($head[$i]):(strlen($head[$i])>$len?$len=strlen($head[$i]):‘‘);
                $next[$k]=$len;
            }
        }    
    }
}    

 

php实现kmp算法

原文:https://www.cnblogs.com/xuzewu/p/8149887.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!