`

php 实现KMP算法

阅读更多
<?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;
        }

   }
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    50个优秀经典PHP算法大集合

    │ ├── TraversalOfBinary.php 二叉树非递归遍历算法实现 │ ├── Knapsack.php 贪心算法之背包问题实现 │ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow │ └── Solution.php Facebook面试题...

    php 算法大全,用 PHP 的方式实现的各类算法合集

    在编程领域,算法是解决问题的关键所在,而PHP作为一门广泛应用的脚本语言,其算法实现同样至关重要。本文将深入探讨如何使用PHP实现各类算法,帮助开发者提升编程技能,更好地应对各种计算挑战。 一、排序算法 1. ...

    用PHP的方式实现的各类算法合集

    6. **字符串处理**:例如KMP算法用于高效地匹配字符串,Trie树(字典树)用于快速查找前缀。 7. **递归与回溯**:如八皇后问题、N皇后问题等,递归是解决这类问题的常见方法。 8. **数值计算**:如欧几里得算法...

    PHP面试题之算法

    1. KMP算法:在主串中查找子串,避免了不必要的回溯,提高了匹配效率。 2. Rabin-Karp算法:一种字符串匹配算法,利用滚动哈希值减少比较次数。 以上只是PHP面试中算法部分的一部分,实际面试中还可能涉及数据结构...

    php-leetcode题解之实现strStr.zip

    如果你希望使用KMP算法,需要额外实现部分匹配表的计算和匹配过程,这会相对复杂一些,但能提供更好的性能。 **总结** 这个压缩包中的文件"php_leetcode题解之实现strStr"应该是提供了PHP实现KMP或朴素方法的代码...

    Algorithm-The-Algorithms-PHP.zip

    此外,字符串处理也是PHP中常见的应用场景,如KMP算法、Rabin-Karp算法用于字符串匹配,以及Manacher's Algorithm解决回文子串问题。这些算法的PHP实现,不仅有助于我们掌握字符串处理技巧,还能启发我们在实际项目...

    数据结构和算法必知必会的 50 个代码实现.zip

    7. 字符串匹配:KMP算法、Boyer-Moore算法等。 8. 图论算法:最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树(Prim算法、Kruskal算法)。 这些代码实现提供了实际操作的机会,让学习者能够看到理论...

    [示例][PHP]敏感词过滤的php类库.zip

    strtr是KMP算法的代表,在对待海量词汇上面,并无优势,并且每次都要加载词库到内存。 使用AC算法写成扩展,将词库加载内存中,是最好的处理方式。 所以badword.src.php可供学习AC算法、学习查找替换等。

    迄今为止最全面的分布式主键ID生成器优化的雪花算法(SnowFlake)雪花漂移算法在缩短ID长度的同时具备高瞬时并发处理能力

    kmp算法。迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 ...

    50个优秀经典PHP算法大集合 附

    1. **排序算法**:包括快速排序、归并排序、堆排序等,用于整理和优化数据结构,如PHP实现二维数组的自定义排序。 2. **查找算法**:二分查找、线性查找等,用于在数据集中定位特定元素,例如PHP二维数组中的查找...

    php中最简单的字符串匹配算法

    在实际应用中,为了提高性能,人们通常会采用更高级的字符串匹配算法,如KMP算法、Boyer-Moore算法或Rabin-Karp算法,它们在一定程度上优化了匹配过程,减少了不必要的字符比较。 然而,对于初学者来说,理解并实现...

    text-search:PHP中的暴力字符串搜索算法实现

    2. **KMP算法**:构建部分匹配表,避免回溯,减少比较次数。 3. **Rabin-Karp算法**:使用哈希函数,通过计算文本和模式的哈希值进行预处理,快速排除大部分不匹配情况。 4. **Sunday算法**:结合了Boyer-Moore和KMP...

    基于PHP实现的一个支持多平台、全网范围的广告拦截工具源码

    这一步依赖于高效的字符串匹配算法,如KMP或Boyer-Moore,以快速定位黑名单中的模式。 2. **DNS解析拦截**:工具可能采用了Pi-hole这样的技术,它是一个基于DNS的广告拦截解决方案。Pi-hole拦截所有的DNS查询,通过...

    Algorithm-php_aho_corasick.zip

    《Aho-Corasick算法在PHP中的实现》 在计算机科学领域,算法是解决特定问题的精确步骤集合,它们使得程序能够高效、准确地执行任务。Aho-Corasick算法,由艾兹格·A·霍斯(Aho)和莫里斯·科拉斯克(Corasick)于...

    算法

    8. 字符串处理算法:PHP中常见的有KMP算法(不回溯的模式匹配)和Rabin-Karp算法(滚动哈希)用于字符串匹配,以及Manacher's Algorithm(最长回文子串)。 9. 数据结构:PHP虽然不像C++或Java那样内置了丰富的数据...

    敏感词过滤的php类库.zip

     strtr是KMP算法的代表,在对待海量词汇上面,并无优势,并且每次都要加载词库到内存。 使用AC算法写成扩展,将词库加载内存中,是最好的处理方式。 所以badword.src.php可供学习AC算法、学习查找替换等。 

    高级PHP程序员必备知识

    - 字符串匹配算法:例如 KMP 算法、Boyer-Moore 算法等,用于提高字符串匹配的效率。 - 字符串排序算法:可以使用快速排序、归并排序等算法对字符串数组进行排序。 **1.2 关键词** - **ASCII**:一种字符编码标准...

    Algorithm-PHPAlgorithms.zip

    - **KMP算法**:不回溯的模式匹配算法,用于字符串查找。 - **Rabin-Karp算法**:滚动哈希技术,提高字符串匹配效率。 5. **动态规划**: - **背包问题**:求解在容量限制下能获取最大价值的物品组合。 - **...

    leetcode卡-leetcode:每日算法练习

    leetcode卡 leetcode 算法题练习 说明: 大部分题实现都在C++文件夹中 ...(自己想不出来不要气馁,好多算法都是好几个数学家一大把年纪提出来的比如KMP) 1.多回顾,尤其是经典题目 2.不要为了刷题而刷题 3.坚持

Global site tag (gtag.js) - Google Analytics