kmp字符串模式匹配算法

来源:互联网 发布:seo招聘要求 编辑:程序博客网 时间:2024/05/17 22:17

概述

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

1 0
原创粉丝点击