码迷,mamicode.com
首页 > 编程语言 > 详细

php实现kmp算法

时间:2017-12-30 15:50:23      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:html   style   com   比较   bcd   any   拆分   count   字符串查找   

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算法

标签:html   style   com   比较   bcd   any   拆分   count   字符串查找   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!