| 
            
            
             
              <?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>             
                       |