<?php class KMP { public $da; private $an; public $pa; private $pn; public function find() { $this->an = count($this->da); $this->pn = count($this->pa); $next = $this->make_next(); $i = $j = $n = 0; // 要怪也怪我们眼力不好,两个函数相似度这么高! while ($i < $this->an) { $n++; if ($this->da[$i] == $this->pa[$j] || $j == -1) { $i++; $j++; } else { $j = $next[$j]; } if ($j == $this->pn) { $rst = $i - $this->pn; break; } } return $rst; } private function make_next() { $next = array(-1); $j = 0; $k = -1; while ($j < $this->pn - 1) { if ($k == -1 || $this->pa[$j] == $this->pa[$k]) { $j++; $k++; $next[$j] = $k; } else { $k = $next[$k]; // 其实从这里已经能看出填空的答案了。。。 } } return $next; } public function show() { $n = $this->find(); echo '<b>Result:</b> ', $n, '<br>'; } } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>Untitled Document</title> </head>
<body> <?php $kmp = new KMP(); $kmp->da = array(1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 3); $kmp->pa = array(1, 2, 1, 1, 2, 1, 1, 1, 2); $kmp->show(); ?> </body> </html>
|