<?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;
}
}
分享到:
相关推荐
│ ├── TraversalOfBinary.php 二叉树非递归遍历算法实现 │ ├── Knapsack.php 贪心算法之背包问题实现 │ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow │ └── Solution.php Facebook面试题...
在编程领域,算法是解决问题的关键所在,而PHP作为一门广泛应用的脚本语言,其算法实现同样至关重要。本文将深入探讨如何使用PHP实现各类算法,帮助开发者提升编程技能,更好地应对各种计算挑战。 一、排序算法 1. ...
6. **字符串处理**:例如KMP算法用于高效地匹配字符串,Trie树(字典树)用于快速查找前缀。 7. **递归与回溯**:如八皇后问题、N皇后问题等,递归是解决这类问题的常见方法。 8. **数值计算**:如欧几里得算法...
1. KMP算法:在主串中查找子串,避免了不必要的回溯,提高了匹配效率。 2. Rabin-Karp算法:一种字符串匹配算法,利用滚动哈希值减少比较次数。 以上只是PHP面试中算法部分的一部分,实际面试中还可能涉及数据结构...
如果你希望使用KMP算法,需要额外实现部分匹配表的计算和匹配过程,这会相对复杂一些,但能提供更好的性能。 **总结** 这个压缩包中的文件"php_leetcode题解之实现strStr"应该是提供了PHP实现KMP或朴素方法的代码...
此外,字符串处理也是PHP中常见的应用场景,如KMP算法、Rabin-Karp算法用于字符串匹配,以及Manacher's Algorithm解决回文子串问题。这些算法的PHP实现,不仅有助于我们掌握字符串处理技巧,还能启发我们在实际项目...
strtr是KMP算法的代表,在对待海量词汇上面,并无优势,并且每次都要加载词库到内存。 使用AC算法写成扩展,将词库加载内存中,是最好的处理方式。 所以badword.src.php可供学习AC算法、学习查找替换等。
7. 字符串匹配:KMP算法、Boyer-Moore算法等。 8. 图论算法:最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树(Prim算法、Kruskal算法)。 这些代码实现提供了实际操作的机会,让学习者能够看到理论...
kmp算法。迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 ...
1. **排序算法**:包括快速排序、归并排序、堆排序等,用于整理和优化数据结构,如PHP实现二维数组的自定义排序。 2. **查找算法**:二分查找、线性查找等,用于在数据集中定位特定元素,例如PHP二维数组中的查找...
在实际应用中,为了提高性能,人们通常会采用更高级的字符串匹配算法,如KMP算法、Boyer-Moore算法或Rabin-Karp算法,它们在一定程度上优化了匹配过程,减少了不必要的字符比较。 然而,对于初学者来说,理解并实现...
2. **KMP算法**:构建部分匹配表,避免回溯,减少比较次数。 3. **Rabin-Karp算法**:使用哈希函数,通过计算文本和模式的哈希值进行预处理,快速排除大部分不匹配情况。 4. **Sunday算法**:结合了Boyer-Moore和KMP...
这一步依赖于高效的字符串匹配算法,如KMP或Boyer-Moore,以快速定位黑名单中的模式。 2. **DNS解析拦截**:工具可能采用了Pi-hole这样的技术,它是一个基于DNS的广告拦截解决方案。Pi-hole拦截所有的DNS查询,通过...
《Aho-Corasick算法在PHP中的实现》 在计算机科学领域,算法是解决特定问题的精确步骤集合,它们使得程序能够高效、准确地执行任务。Aho-Corasick算法,由艾兹格·A·霍斯(Aho)和莫里斯·科拉斯克(Corasick)于...
8. 字符串处理算法:PHP中常见的有KMP算法(不回溯的模式匹配)和Rabin-Karp算法(滚动哈希)用于字符串匹配,以及Manacher's Algorithm(最长回文子串)。 9. 数据结构:PHP虽然不像C++或Java那样内置了丰富的数据...
strtr是KMP算法的代表,在对待海量词汇上面,并无优势,并且每次都要加载词库到内存。 使用AC算法写成扩展,将词库加载内存中,是最好的处理方式。 所以badword.src.php可供学习AC算法、学习查找替换等。
- 字符串匹配算法:例如 KMP 算法、Boyer-Moore 算法等,用于提高字符串匹配的效率。 - 字符串排序算法:可以使用快速排序、归并排序等算法对字符串数组进行排序。 **1.2 关键词** - **ASCII**:一种字符编码标准...
- **KMP算法**:不回溯的模式匹配算法,用于字符串查找。 - **Rabin-Karp算法**:滚动哈希技术,提高字符串匹配效率。 5. **动态规划**: - **背包问题**:求解在容量限制下能获取最大价值的物品组合。 - **...
leetcode卡 leetcode 算法题练习 说明: 大部分题实现都在C++文件夹中 ...(自己想不出来不要气馁,好多算法都是好几个数学家一大把年纪提出来的比如KMP) 1.多回顾,尤其是经典题目 2.不要为了刷题而刷题 3.坚持