• 4.2 串的模式匹配算法


    <?php
    header("content-type:text/html;charset=utf-8");
    class Linear_string{
        /**
         * 串模式匹配算法
         *
         *包括
         * 1.串的初始化 __contruct()
         * 2.朴素的模式匹配算法 index()
         * 3.KMP模式匹配算法
         * 4.改进的KMP模式匹配算法
         */
    
        private $string;
        private $length;
        //构造函数
        public function __construct($string)
        {
            $this->length =strlen($string);
            $this->string = $string;
    
        }
        //朴素的模式匹配算法
        public function index($string,$pos){
            if($pos<0 || $pos >$this->length){
                echo "索引长度错误";
                return false;
            }
    
            $i = $pos-1;//i用来表示主串当前位置下标,从pos位置开始
            $j = 0;    //j用来表示子串当前位置下标,从子串头位置开始
    
            while($i< $this->length && $j< $string->length){
                if($this->string[$i] == $string->string[$j]){
                    $i++;
                    $j++;
                }else{
                    $i = $i-$j+2;  //i退回上次匹配首位的下一位
                    $j = 0;
                }
    
            }
    
            if($j >= $string->length){//若子串索引大于或者等于子串的长度,证明匹配成功,用i减去子串的长度就是主串与子串匹配的起始位置
                return $i-$string->length;
            }else{
                return 0;
            }
        }
    
        //KMP模式匹配算法
        public function get_next($string,$next = array()){
            $i = 0;
            $j = 0;
            $next[1] = 0;
            while ($i<$string->length){
                if($j == 0 || $string->string[$i] == $string->string[$j]){//$this->string[$i]代表后缀的单个字符,$this->string[$j]代表前缀的单个字符
                    $i++;
                    $j++;
                    $next[$i] = $j;
                }else{
                    $j = $next[$j];
                }
            }
        }
    
        public function index_KMP($string,$pos){
            $i = $pos-1;
            $j = 0;
            $next = array();
            $this->get_next($string,$next);
            while($i< $this->length && $j< $string->length){
                if($j == 0 || $this->string[$i] == $string->string[$j]){
                    $i++;
                    $j++;
                }else{
    
                    $j = $next[$j];
                }
    
            }
            if($j>=$string->length){
                return $i - $string->length;
            }else{
                return 0;
            }
        }
    
        //改进的KMP模式匹配算法
        public function get_nextval($string,$next_val = array()){
            $i = 0;
            $j = 0;
            $next_val[1] = 0;
            while ($i<$string->length){
                if($j==0 || $string->string[$i] == $string->string[$j]){//$this->string[$i]代表后缀的单个字符,$this->string[$j]代表前缀的单个字符
                    $i++;
                    $j++;
                    if($this->string[$i]!=$string->string[$j]){//若当前字符与前缀字符不同,则当前的j为$next_val[$i]在i的位置,即next[$i]
                        $next_val[$i] = $j;
                    }else{
                        $next_val[$i] = $next_val[$j];//如果与前缀字符相同,则将前缀字符的$next_val赋值给$next_val在i的位置
                    }
    
                }else{
                    $j = $next_val[$j];
                }
    
            }
        }
        public function index_KMPval($string,$pos){
            $i = $pos-1;
            $j = 0;
            $next_val = array();
            $this->get_nextval($string,$next_val);
            while ($i< $this->length && $j< $string->length){
                if ($j == 0 || $this->string[$i] == $string->string[$j]){
                    $i++;
                    $j++;
    
                }else{
    
                    $j = $next_val[$j];
                }
            }
    
            if($j>=$string->length){
    
                return $i - $string->length;
            }else{
                return 0;
            }
        }
    
    
    }
    ?>

    实现上述函数:

    <?php
    header("content-type:text/html;charset=utf-8");
    include 'match_string.class.php';
    $string = "xiaolinzifendoudediandi";
    $linear_string = new Linear_string($string);
    
    $string1 = new Linear_string("fendou");
    echo "朴素模式匹配算法结果:";
    echo "</br>";
    $index = $linear_string->index($string1,4);
    echo $index;
    echo "</br>";
    echo "</br>";
    
    echo "KMP模式匹配算法结果:";
    echo "</br>";
    $index = $linear_string->index_KMP($string1,4);
    echo $index;
    echo "</br>";
    echo "</br>";
    
    echo "改进KMP模式匹配算法结果:";
    echo "</br>";
    $index = $linear_string->index_KMPval($string1,4);
    echo $index;
    ?>

    最后的实现结果:

  • 相关阅读:
    本周学习小结(04/11
    学习笔记之知识图谱 (Knowledge Graph)
    本周学习小结(28/10
    本周学习小结(21/10
    条件分页 代替离线查询
    Apache POI 一键上传(导入excel文件到数据库)
    easyui 菜单按钮&提示框
    Jquery ztree树插件
    Jquery ztree树插件2
    ui
  • 原文地址:https://www.cnblogs.com/xlzfdddd/p/9856276.html
Copyright © 2020-2023  润新知