標籤: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演算法