今天看的 [转自 matrix67.com]KMP算法详解
。然后根据自己的理解写了个java的程序,也不知道自己理解KMP字符串比较算法是否正确,希望大家能多提意见。
package com.dianziermu.arith;
/**
* 字符串比较之KMP算法
*
* @think 思路: <br>
* 如果mainChar[i]==subChar[0],则继续比较mainChar[i+1]和subChar[1]是否相等。 <br>
* 一直相等则一直比较到subChar[subChar.length-1]与主串的是否相等。如果相等则返回i,找到结果结束。 <br>
* 如果有不等的,则比较mainChar[i+1]与subChar[0]是否相等,一直比较下去。 <br>
* 直到循环到mainChar[i+j]时,若i+j+subChar.length>mainChar.length,<br>
* 说明剩余的主串上的字符串不够子串的长度,肯定不会匹配,退出。
* @author 点子二木
* @date 2009-5-4
* @version 1.0
*/
public class KMPMine {
/**
* @param args
*/
public static void main(String[] args) {
String mainStr = "ababaab";
String subStr = "aab";
System.out.println("首索引为:" + KMP(mainStr, subStr));
}
/**
* 比较主串中是否有子串
*
* @param mainStr主串
* @param subStr子串
* @return 有-返回子串在主串中首字母的索引,主串起始索引为0; 无-返回(-1)
*/
private static int KMP(String mainStr, String subStr) {
int comfortIndex = -1;
char[] mainChar = mainStr.toCharArray();
char[] subChar = subStr.toCharArray();
int mainCurrentIndex = 0;// 主串当前索引
int mainEqualIndex = 0;// 正在比较的已经相等的主串起始位置
int subCurrentIndex = 0;// 子串当前索引
int subEqualIndex = 0;// 子串中已经有匹配的个数
while (mainCurrentIndex < mainChar.length) {
// System.out.println("循环"+mainCurrentIndex);
// 循环到剩余的主串上的字符串不够子串的长度,肯定不会匹配,退出
if (mainEqualIndex + subChar.length > mainChar.length) {
return comfortIndex;
}
if (mainChar[mainCurrentIndex] == subChar[subCurrentIndex]) {// 匹配
// 比较到子串最后一位也匹配
if (subEqualIndex == subChar.length - 1) {// 整个都匹配
comfortIndex = mainEqualIndex;
return comfortIndex;
}
// 移动子串的索引
subCurrentIndex++;
mainCurrentIndex++;
subEqualIndex++;
} else {
// 移动整个子串,将当前索引移动到本次整个串比较的的最前端(即mainEqual)的下一位
mainEqualIndex++;
mainCurrentIndex = mainEqualIndex;
subCurrentIndex = 0;
subEqualIndex = 0;
}
}
return comfortIndex;
}
}
运行结果为:
首索引为:4
分享到:
相关推荐
KMP算法的代码实现通常使用C++、Java、Python等编程语言,代码简洁且易于理解,是算法学习的经典案例。 总的来说,KMP算法以其高效性和广泛的应用性,成为字符串匹配领域不可或缺的一部分。通过理解和掌握KMP算法,...
阅读这份报告可以帮助读者深入理解KMP算法,并提供实践操作的指导。 总的来说,KMP算法是字符串匹配问题的重要解决方案,通过构建部分匹配表来优化比较过程,提高了搜索效率,是计算机科学中不可或缺的基础算法之一...
首先,我们需要理解KMP算法的基本思想。在匹配过程中,如果当前字符不匹配,KMP算法不会像朴素算法那样回溯到上一个字符,而是根据前缀函数确定下一个可能匹配的字符位置。前缀函数(也称为部分匹配表)记录了子串中...
压缩包中的"C语言kmp算法实现.cpp"文件很可能是这样一个实现,可以作为学习和理解KMP算法的实例。 至于"www.pudn.com.txt"文件,可能包含了一些关于算法的额外信息,如算法的来源、使用说明或其他相关资源链接。在...
字符串匹配是计算机科学中一个基础且重要的问题,广泛应用于文本处理、搜索引擎、数据挖掘等领域。...理解并掌握KMP算法,对于从事编程和相关领域的专业人士来说,是提高工作效率和解决问题的关键技能之一。
理解并正确实现KMP算法和fail数组的计算对于提高字符串匹配的效率至关重要。在实际应用中,如文本处理、数据分析等领域,KMP算法因其高效的特性而被广泛采用。通过深入学习和实践,不仅可以掌握这个经典算法,还能...
KMP(Knuth-Morris-Pratt)...通过分析和运行这个项目,你可以深入理解KMP算法的工作原理,并且能够将其应用到实际的字符串处理任务中,例如文本查重。KMP算法在文本处理、数据挖掘、生物信息学等领域都有广泛的应用。
学习和理解KMP算法,不仅可以帮助我们解决实际的字符串匹配问题,还能加深对动态规划和模式识别的理解,对于从事编程、数据处理以及计算机科学相关的工作者而言,是一项必备的技能。通过阅读和分析`KMP.CPP`的源代码...
《KMP算法:高效字符串匹配的秘诀》 在信息技术领域,字符串处理是不可或缺的一部分,而字符串的比较和匹配则是其中的基础任务。...对于任何对计算机科学感兴趣的开发者来说,理解和掌握KMP算法都是非常有益的。
KMP(Knuth-Morris-Pratt)算法是一种在文本串中查找子串出现位置的高效算法,由Donald Knuth、...在学习和理解KMP算法的过程中,不仅可以掌握其基本原理,还可以深入探讨如何优化字符串处理算法,提升编程能力。
《KMP算法与通配符支持在字符串匹配中的应用》 KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的...理解并掌握KMP算法及其通配符支持,对于任何从事文本处理和数据搜索工作的开发者来说,都是一项不可或缺的技能。
标题中的“改进KMP算法.zip_KMP算法_c语言数据结构”指的是一个关于KMP(Knuth-Morris-Pratt)算法的项目,该算法在C语言的数据结构...通过实现这个项目,不仅可以深入理解KMP算法的工作原理,还能锻炼C语言编程能力。
本资料包“KMP.zip_DNA_KMP算法”将带你深入理解这一经典算法,并结合生物信息学中的DNA序列分析进行探讨。 KMP算法的基本思想是避免在模式匹配过程中对已匹配的字符进行重复比较。当模式串中出现部分匹配失败时,...
这个“kmp.rar”压缩包包含了一个C++实现的KMP算法以及Hirschberg算法的源码,这些资源对于理解和应用字符串搜索算法非常有帮助。 KMP算法的核心在于构造一个“部分匹配表”(也称为“失败函数”或“前缀后缀表”)...
你可以通过查看这些代码来学习KMP算法的具体实现,以及它是如何与快速排序算法结合在一起工作的,这有助于深入理解这两种重要的算法。 KMP算法和快速排序都是基础且实用的算法,广泛应用于实际编程中,对于提升编程...
1、实现KMP模式匹配算法、哈夫曼编码算法、由遍历序列恢复二叉树、Prim算法、Kruskal算法、Floyd算法、Dijkstra算法、拓扑排序、关键路径算法、二叉排序树生成算法(含平衡化)、哈希表生成及哈希查找算法、希尔排序...
KMP算法,全称为Knuth-...总的来说,KMP算法是字符串处理领域的重要算法之一,对于理解和实现高效字符串匹配具有重要意义。通过学习和掌握KMP算法,可以提高解决相关问题的能力,并为其他高级算法的学习打下基础。
KMP算法源代码,很好用的。 KMP算法源代码,很好用的。
算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP
《KMP算法在MATLAB中的实现》 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D. E....对于学习和理解KMP算法以及在MATLAB中进行字符串处理的开发者来说,这是一个非常有价值的资源。