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

最后的实现结果:

原文地址:https://www.cnblogs.com/xlzfdddd/p/9856276.html

时间: 2024-10-10 08:47:45

4.2 串的模式匹配算法的相关文章

第四章:2.串 -- 串的模式匹配算法(KMP)

前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 串的模式匹配算法 主串 S: a b c a b c d s v t 子串 T: a b c d 一.原始算法 匹配一旦失败,子串即向右移动一个单位,直到完全匹配停止. 第一次匹配:(注:红色代表不匹配(失配)) S: a b c a b c a b c d s v t   T: a b c d

串的模式匹配算法(KMP)

算法: #include<IOSTREAM> using namespace std; #define MAXSIZE 100 void calNext(const char *T,int *next);//T为模式串,next为预判数组 int kmp_match(const char *S,const char *T);//在主串S中寻找模式串T,如果找到返回其位置,否则返回-1.位置从0开始 void calNext(const char *T,int *next) { int n =

24、蛤蟆的数据结构笔记之二十四串的模式匹配算法

24.蛤蟆的数据结构笔记之二十四串的模式匹配算法 本篇名言:"燧石受到的敲打越厉害,发出的光就越灿烂. -- 马克思" 来看下两个算法,BF和KMP算法在串的模式匹配中实现. 欢迎转载,转载请标明出处: 1.  BF算法 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.B

串的模式匹配算法(BF算法和KMP算法)

串的模式匹配算法 子串的定位操作通常称为串的 模式匹配,其中T称为 模式串. 一般的求子串位置的定位函数(Brute Force) 我写java的代码是这样的 int index(String S,String T,int pos){ char[] s_arr = S.toCharArray(); char[] t_arr = T.toCharArray(); int i,j,k;//i是主串S的指针,j是模式串的指针 if(pos < 0 || pos>S.length() || S.len

《数据结构》之串的模式匹配算法——KMP算法

1 //串的模式匹配算法 2 //KMP算法,时间复杂度为O(n+m) 3 #include <iostream> 4 #include <string> 5 #include <cstring> 6 using namespace std; 7 8 //-----串的定长顺序存储结构----- 9 #define MAXLEN 255 //串的最大长度 10 typedef struct { 11 char ch[MAXLEN + 1]; //存储串的一维数组 12

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

串-KMP模式匹配算法(nextval数组)

#include <stdio.h> #include <stdlib.h> #include <string.h> void get_next(char T[100],int *next); int Index_KMP(char S[100],char T[100],int pos); int main() { int n; char S[100],T[100]; gets(S); gets(T); n=Index_KMP(S,T,2); printf("%

数据结构- 串的模式匹配算法:BF和 KMP算法

Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute-Force算法的实现 c语言实现: [cpp] vie

【数据结构】1、串的模式匹配算法

首先我们一般求子串的位置的时候,我们可以使用这样的方法 /* *功能:这个是定长的串的顺序存储 *时间:2015年7月15日17:16:01 *文件:SString.h *作者:cutter_point */ #ifndef SSTRING_H #define SSTRING_H #define MAXSTRLEN 255 class SString { unsigned char* ch; //我们的串的顺序存储空间 unsigned int length; //我们有效元素的个数 publi