zoukankan      html  css  js  c++  java
  • php 实现KMP算法

    简介:这是php 实现KMP算法的详细页面,介绍了和php,php, kmp, 数据结构, 算法 php 实现KMP算法有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=360997' scrolling='no'> <?php
        /**
         * KMP算法的PHP实现
         *
         * @author zhaojiangwei 2011/10/22 10:28
         */
    
    
        class KMP{
            private $next = NULL; //模式串T的next数组
            private $t = NULL; //模式串
            private $str = NULL; //主串

            public function KMP($str){
                $this->str = str_split($str);
                $this->next = array();
            }

            //返回主串的长度
            public function getStrCount(){
                return count($this->str);
            }

            //返回结果
            public function getStrPos($substr){
                $substr = str_split($substr);
                $this->getNext($substr);
                $strCount = $this->getStrCount();
                $substrCount = count($substr);
                $subIndex = 0;//子串的起始比较位置
                $strIndex = 0;//主串目前的比较到的位置

                while($subIndex < $substrCount && ($strCount - $strIndex) >= ($substrCount - $subIndex)){
                    if($subIndex == -1 || $this->str[$strIndex] == $substr[$subIndex]){
                        $subIndex ++;
                        $strIndex ++;
                    }else{
                        $subIndex = $this->next[$subIndex];
                    }
                }

                if($subIndex == $substrCount){
                    return $strIndex - $substrCount;
                }else{
                    return false;
                }
             }

             //求模式串的NEXT数组
             public function getNext($t){
                if(!is_array($t)){
                    $t = str_split($t);
                }

                $this->next[0] = -1;
                $count = count($t);

                $i = 0;
                $j = -1;
                while($i < $count){
                    if($j == -1 || $t[$i] == $t[j]){
                        $j ++;
                        $i ++;
                       
                        if($t[$i] == $t[$j]){
                            $this->next[$i] = $this->next[$j];
                        }else{
                            $this->next[$i] = $j;
                        }
                    }else{
                        $j = $this->next[$j];
                    }
                }

                return $this->next;
            }

       }

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/360997.html pageNo:1
  • 相关阅读:
    COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
    A Complete ActiveX Web Control Tutorial
    C++使用VARIANT实现二维数组的操作
    用户自定义结构数据与VARIANT转换
    VS2008中使用JSONCPP方法小结
    HDOJ 2030 汉字统计
    HDOJ 1312 (POJ 1979) Red and Black
    POJ 1503 Integer Inquiry 简单大数相加
    POJ 1936 All in All
    枚举法
  • 原文地址:https://www.cnblogs.com/ooooo/p/2235984.html
Copyright © 2011-2022 走看看