`
dianziermu
  • 浏览: 139738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

KMP算法随感_求理解是否正确

阅读更多

今天看的   [转自 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    

 

 

 

0
0
分享到:
评论
2 楼 dianziermu 2009-05-12  
kdboy 写道

错误的,你还没理解kmp算法。1、主串索引不回溯2、字串索引根据自匹配算法确定回溯位置


我修改了一下,现在对么,子串如何回溯????

package com.dianzi.arith;

/**
 * 字符串比较之KMP算法<br>
 * 即:比较主串中是否包含子串,如果包含,则返回在主串的索引位置(主串首索引为0)<br>
 * 						  如果不包含,则返回-1;<br>
 * 
 * @think 思路: <br>
 *        按顺序循环主串索引,循环到剩余的主串上的字符串不够子串的长度,肯定不会匹配,退出。<br>
 *        在每一个主串索引上,比较此时 “以主串索引位置为开始、子串长度的字符串和子串是否相等”<br>
 *        若相等则找到,返回主串索引位置即可;若不等则未找到,继续循环主串索引<br>
 * @author 点子二木
 * @date 2009-5-12
 * @version 1.0
 */
public class KMPMine {

	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)
	 */
	public static int KMP(String mainStr, String subStr) {
		int comfortIndex = -1;
		if (mainStr == null) {
			mainStr = "";
		}
		if (subStr == null) {
			subStr = "";
		}
		char[] mainChar = mainStr.toCharArray();
		char[] subChar = subStr.toCharArray();

		// 循环到剩余的主串上的字符串不够子串的长度,肯定不会匹配,退出
		for (int mainIndex = 0; mainIndex <= mainChar.length - subChar.length; mainIndex++) {
			String mainSubStr = mainStr.substring(mainIndex, mainIndex
					+ subChar.length);// 被截的主串
			if (compareSubStr(mainSubStr, subStr)) {// 相等
				return mainIndex;
			}
		}
		return comfortIndex;
	}

	/**
	 * 比较子串和子串长度相等的被截的主串是否相等
	 * 
	 * @param mainSubStr被截主串
	 * @param subStr子串
	 * @return 返回:true-相等;false-不相等
	 */
	private static boolean compareSubStr(String mainSubStr, String subStr) {
		char[] mainSubChar = mainSubStr.toCharArray();
		char[] subChar = subStr.toCharArray();

		for (int subIndex = 0; subIndex < subChar.length; subIndex++) {
			if (mainSubChar[subIndex] == subChar[subIndex]) {// 匹配
				// System.out.println("循环" + subIndex);//测试循环次数
				// 比较到子串最后一位也匹配
				if (subIndex == subChar.length - 1) {// 整个都匹配
					return true;
				}
			} else {// 不匹配,移动主索引
				return false;
			}
		}
		return false;

	}
}
1 楼 kdboy 2009-05-05  
错误的,你还没理解kmp算法。
1、主串索引不回溯
2、字串索引根据自匹配算法确定回溯位置

相关推荐

    KMP.rar_KMP_KMP算法_串 KMP算法_字符串匹配

    KMP算法的代码实现通常使用C++、Java、Python等编程语言,代码简洁且易于理解,是算法学习的经典案例。 总的来说,KMP算法以其高效性和广泛的应用性,成为字符串匹配领域不可或缺的一部分。通过理解和掌握KMP算法,...

    KMP.rar_KMP算法_java KMP_kmp string_kmp string tutorial_算法

    阅读这份报告可以帮助读者深入理解KMP算法,并提供实践操作的指导。 总的来说,KMP算法是字符串匹配问题的重要解决方案,通过构建部分匹配表来优化比较过程,提高了搜索效率,是计算机科学中不可或缺的基础算法之一...

    KMP.rar_KMP_KMP算法_kmp改进

    首先,我们需要理解KMP算法的基本思想。在匹配过程中,如果当前字符不匹配,KMP算法不会像朴素算法那样回溯到上一个字符,而是根据前缀函数确定下一个可能匹配的字符位置。前缀函数(也称为部分匹配表)记录了子串中...

    C语言kmp算法实现.rar_ C KMP_C语言_KMP_KMP算法_MIMO BLAST

    压缩包中的"C语言kmp算法实现.cpp"文件很可能是这样一个实现,可以作为学习和理解KMP算法的实例。 至于"www.pudn.com.txt"文件,可能包含了一些关于算法的额外信息,如算法的来源、使用说明或其他相关资源链接。在...

    字符串匹配的KMP算法.rar_KMP_KMP算法_kmp 字符串匹配_字符串匹配_文件

    字符串匹配是计算机科学中一个基础且重要的问题,广泛应用于文本处理、搜索引擎、数据挖掘等领域。...理解并掌握KMP算法,对于从事编程和相关领域的专业人士来说,是提高工作效率和解决问题的关键技能之一。

    KMP-fail.rar_kmp fail_kmp的fail_kmp算法fail数组_kmp算法求fail

    理解并正确实现KMP算法和fail数组的计算对于提高字符串匹配的效率至关重要。在实际应用中,如文本处理、数据分析等领域,KMP算法因其高效的特性而被广泛采用。通过深入学习和实践,不仅可以掌握这个经典算法,还能...

    kmp.zip_kmp查重_查重 kmp算法_进行字符串查

    KMP(Knuth-Morris-Pratt)...通过分析和运行这个项目,你可以深入理解KMP算法的工作原理,并且能够将其应用到实际的字符串处理任务中,例如文本查重。KMP算法在文本处理、数据挖掘、生物信息学等领域都有广泛的应用。

    KMP.rar_KMP_KMP算法_visual c_字符串匹配_字符串匹配算法

    学习和理解KMP算法,不仅可以帮助我们解决实际的字符串匹配问题,还能加深对动态规划和模式识别的理解,对于从事编程、数据处理以及计算机科学相关的工作者而言,是一项必备的技能。通过阅读和分析`KMP.CPP`的源代码...

    KMP.rar_KMP_KMP算法_字符串 c++_字符串效率

    《KMP算法:高效字符串匹配的秘诀》 在信息技术领域,字符串处理是不可或缺的一部分,而字符串的比较和匹配则是其中的基础任务。...对于任何对计算机科学感兴趣的开发者来说,理解和掌握KMP算法都是非常有益的。

    kmp Algorithm.rar_KMP_kmp dna_串 KMP算法_字符串_字符串匹配

    KMP(Knuth-Morris-Pratt)算法是一种在文本串中查找子串出现位置的高效算法,由Donald Knuth、...在学习和理解KMP算法的过程中,不仅可以掌握其基本原理,还可以深入探讨如何优化字符串处理算法,提升编程能力。

    KMP.rar_KMP_KMP 串匹配_KMP 支持通配符

    《KMP算法与通配符支持在字符串匹配中的应用》 KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的...理解并掌握KMP算法及其通配符支持,对于任何从事文本处理和数据搜索工作的开发者来说,都是一项不可或缺的技能。

    改进KMP算法.zip_KMP算法_c语言数据结构

    标题中的“改进KMP算法.zip_KMP算法_c语言数据结构”指的是一个关于KMP(Knuth-Morris-Pratt)算法的项目,该算法在C语言的数据结构...通过实现这个项目,不仅可以深入理解KMP算法的工作原理,还能锻炼C语言编程能力。

    KMP.zip_DNA_KMP算法

    本资料包“KMP.zip_DNA_KMP算法”将带你深入理解这一经典算法,并结合生物信息学中的DNA序列分析进行探讨。 KMP算法的基本思想是避免在模式匹配过程中对已匹配的字符进行重复比较。当模式串中出现部分匹配失败时,...

    kmp.rar_kmp算法伪代码

    这个“kmp.rar”压缩包包含了一个C++实现的KMP算法以及Hirschberg算法的源码,这些资源对于理解和应用字符串搜索算法非常有帮助。 KMP算法的核心在于构造一个“部分匹配表”(也称为“失败函数”或“前缀后缀表”)...

    KMP.rar_KMP算法_字符串

    你可以通过查看这些代码来学习KMP算法的具体实现,以及它是如何与快速排序算法结合在一起工作的,这有助于深入理解这两种重要的算法。 KMP算法和快速排序都是基础且实用的算法,广泛应用于实际编程中,对于提升编程...

    suanfa.rar_Dijkstra radix_KMP算法演示_希尔排序

    1、实现KMP模式匹配算法、哈夫曼编码算法、由遍历序列恢复二叉树、Prim算法、Kruskal算法、Floyd算法、Dijkstra算法、拓扑排序、关键路径算法、二叉排序树生成算法(含平衡化)、哈希表生成及哈希查找算法、希尔排序...

    KMP.rar_KMP_KMP算法

    KMP算法,全称为Knuth-...总的来说,KMP算法是字符串处理领域的重要算法之一,对于理解和实现高效字符串匹配具有重要意义。通过学习和掌握KMP算法,可以提高解决相关问题的能力,并为其他高级算法的学习打下基础。

    KMP.rar_KMP_KMP算法_visual c

    KMP算法源代码,很好用的。 KMP算法源代码,很好用的。

    KMP算法算法 KMP算法 KMP

    算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP

    kmp.zip_KMP_in_kmp matlab_matlab kmp

    《KMP算法在MATLAB中的实现》 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D. E....对于学习和理解KMP算法以及在MATLAB中进行字符串处理的开发者来说,这是一个非常有价值的资源。

Global site tag (gtag.js) - Google Analytics