KMP字符串比较算法(php版本)
2016年7月5日
没有评论
前段时间面试的时候,被一个公司的人问到过,今天正好在地铁上面看到了关于KMP算法的文章,作者写的很好,我这个算法渣都看懂了!于是就抽空写了这个PHP版本的kmp算法实现,写的不好的地方欢迎指正。
<?php
/**
* kmp字符串比较算法
*/
/**
* 获得所有前缀集合
* @param string $string
*
* @return array
*/
function get_prefix_set($string){
$len = strlen($string);
if($len <= 1 ) return [];
$prefixs = [];
for($i=1;$i<$len;$i++){
$prefixs[] = substr($string,0,$i);
}
return $prefixs;
}
/**
* 获得所有后缀集合
* @param string $string
*
* @return array
*/
function get_suffix_set($string){
$len = strlen($string);
if($len<=1) return [];
$suffixs = [];
for($i=1;$i<$len;$i++){
$suffixs[] = substr($string,$i);
}
return $suffixs;
}
/**
* 查找字符串$str2是否在$str1中出现
* @param string $str1
* @param string $str2
*
* @return bool
*/
function my_strstr($str1,$str2){
$prefixSet = get_prefix_set($str2);
$suffixSet = get_suffix_set($str2);
$intersection = array_intersect($prefixSet,$suffixSet);
$matchValue = 0;
if(!empty($intersection)){
foreach($intersection as $tmpstr){
$len = strlen($tmpstr);
if($len>$matchValue) $matchValue = $len;
}
}
$str1_len = strlen($str1);
$str2_len = strlen($str2);
$endPos = $str1_len-$str2_len;
if($endPos<0){
return false;
}
for($i=0;$i<=$endPos;){
$moveStep = 1;
for($n=0;$n<$str2_len;$n++){
if($str1[$i+$n] != $str2[$n]){//字符串不匹配时,跳出本次循环
$moveStep = $n-$matchValue;
$moveStep = $moveStep > 0 ? $moveStep : 1;
break 1;
}else if($str1[$i+$n] == $str2[$n] && $n==$str2_len-1){
return true;
}
}
$i +=$moveStep;
}
return false;
}
$result = my_strstr("abcabfcde","bfcd");
var_dump($result);
如果对KMP算法不是特别了解可以看一下《字符串匹配的KMP算法》。
近期评论