KMP算法的Java实现:
1. KMP算法的思路:
1) 首先对模式串构建next数组,表示当某一位不匹配的时候需要回溯的下一个位置;
2) 然后在对主串使用该模式串进行匹配,当遇到不相等的地方,查询next数组,选择模式串中下一个要匹配的位置的字符;
如果该字符和当前不匹配的字符一样的话,则进一步获取新位置在next数组的值,直到要匹配位置的字符是新的字符;
(不要此步骤也可以,此步骤更加优化)
3) 直到到达模式串结尾。
KMP算法的复杂度:
首先生成匹配字符串的next数组的时间复杂度为,每个元素的前面部分元素都需要检查前后是否相等,因此为
1/2*(1+m)*m/2=m(1+m)/4,因此为o(m2);
匹配阶段,每个主字符串位置移动,因此为o(n);
整个为o(m2+n);
KMP算法的Java实现:
package org.iaiai.suanfa;
/**
*
* <p>
* Title: KMP.java
* </p>
* <p>
* E-Mail: 176291935@qq.com
* </p>
* <p>
* QQ: 176291935
* </p>
* <p>
* Http: iaiai.iteye.com
* </p>
* <p>
* Create time: 2011-8-5
* </p>
*
* @author 丸子
* @version 0.0.1
*/
public class KMP {
String s; // 主字符串
String p; // 匹配字符串
int[] next; // 匹配字符串的next数组
int times; // 记录匹配的次数
int index; // 记录查找到的位置
/**
* 构造函数,初始化各个成员变量
*
* @param s
* @param p
*/
KMP(String s, String p) {
this.s = s;
this.p = p;
this.next = new int[p.length()];
for (int i = 0; i < p.length(); i++) {
if (i == 0) {
this.next[i] = -1;
} else if (i == 1) {
this.next[i] = 0;
} else {
this.next[i] = next(p.substring(0, i)); // 对某个位置之前的字符串考察其开始部分和结尾部分是否相同
}
}
this.times = 0;
this.index = -1;
}
/**
* 返回子字符串,开始部分和结尾部分相同的情况下的开始部分的下一个位置,即next值
*
* @param p
* @return
*/
private int next(String p) {
int length = p.length() / 2;
while (length > 0) {
if (p.substring(0, length).compareTo(
p.substring((p.length() - length), p.length())) == 0) {
return length;
}
length--;
}
return length;
}
/**
* 对主字符串进行比较,碰到不匹配,查询next数组;如果新元素和当前不匹配元素相同,则继续next
*
* @return
*/
boolean match() {
int i = 0;
int j = 0;
int index = -1; // index记录匹配的位置
while (i < this.s.length() && j < this.p.length()) {
if (this.s.charAt(i) == this.p.charAt(j)) {
if (j == 0) {
index = i;
}
i++;
j++;
} else {
// 一直寻找next,知道和当前元素不相等的元素,将其下标赋值给j
int newj = this.next[j];
while ((newj != -1)
&& (this.p.charAt(newj) == this.p.charAt(j))) {
newj = this.next[newj];
}
j = newj;
if (j == -1) {
i++;
j = 0;
} else {
index = i - j;
}
}
this.times++;
}
if (j == this.p.length()) {
this.index = index;
return true;
} else {
return false;
}
}
public static void main(String[] args) {
String s = "abacsbababbcacs";
String p = "ab";
KMP m = new KMP(s, p);
// 顺便打印next数组;
for (int i = 0; i < m.next.length; i++) {
System.out.println(m.next[i] + " ");
}
if (m.match()) {
System.out.println("match");
System.out.println("match times: " + m.times);
int index = m.index;
System.out.println(index);
} else {
System.out.println("not match");
}
}
}
分享到:
相关推荐
KMP字符串匹配算法C语言实现 KMP字符串匹配算法是一种高效的字符串匹配算法,它的主要思想是通过构建前缀表(prefix)来避免不必要的比较操作。该算法由Donald Knuth、Vaughan Pratt和Morris在1977年首次提出。 在...
### KMP字符串匹配算法 #### 一、简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,由Donald Knuth、James H. Morris和Vaughan Pratt三位计算机科学家共同提出。该算法的主要优点在于它能够有效地...
带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),以表示任意字符或单个任意字符。这种算法使得搜索更加灵活,可以适应更复杂的查询需求。 **通配符的含义** -...
KMP字符串匹配算法 KMP字符串匹配算法是当前最快的字符串匹配算法之一,由Donald Knuth、Vaughan Pratt和Morris在1977年共同发明。该算法的优点在于可以在O(n)的时间复杂度下实现字符串匹配,具有高效、快速和准确...
### KMP字符串匹配算法及其C语言实现 #### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和Vaughan Pratt共同提出。该算法的核心思想是在模式串(需要...
KMP(Knuth-Morris-Pratt)字符串模式匹配算法是一种高效的字符串搜索算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年提出。该算法避免了简单匹配算法中的不必要的回溯,显著提高了在文本字符串中查找模式字符串...
首先构建部分匹配表,然后在文本串中匹配模式串。如果匹配成功,则返回模式串在文本串中的起始索引;否则返回-1。在测试代码中,我们测试了一个文本串和一个模式串的匹配情况。如果匹配成功,则输出模式串在文本串中...
KMP(Knuth-Morris-Pratt)字符串查找算法是一种在主串中高效地查找子串的算法,由Donald Knuth、Vaughan Pratt和James H. Morris三位学者于1970年代提出。该算法避免了在匹配过程中对已匹配部分的重复比较,从而...
总的来说,KMP算法是一种高效的字符串匹配方法,它通过避免不必要的字符比较和回溯,大大提高了搜索效率。理解并掌握KMP算法,对于从事编程和相关领域的专业人士来说,是提高工作效率和解决问题的关键技能之一。
在这个主题中,我们将探讨三种经典的字符串匹配算法:穷举法、KMP(Knuth-Morris-Pratt)算法和BM(Boyer-Moore)算法。 1. **穷举法**:也称为朴素匹配算法,是最直观的字符串匹配方法。它通过比较主串中的每个...
如何用KMP字符串匹配算法求出主串中所包含模式串的总个数 #include using namespace std; void getnext(int next[],string s,int len) { int j=0,k=-1; next[0]=-1; while(j<len){ if(k==-1||s[j]==s[k]){ j...
总之,KMP字符串匹配算法是字符串搜索领域的一个经典方法,通过构造部分匹配表优化了比较过程,避免了无效的回溯,提高了查找效率。在实际编程中,理解并熟练运用KMP算法,能有效解决大量字符串处理问题。
KMP字符串模式匹配算法是一种高效的字符串搜索算法,由D.E.Knuth、V.R.Morris和J.W.Pratt三位学者提出,因此得名KMP算法。该算法避免了在匹配过程中不必要的字符回溯,提高了匹配效率。下面我们将深入探讨KMP算法的...
本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为“部分匹配表”或...
本篇文章将详细探讨四种常见的字符串匹配算法:平凡算法(SimpleSM)、KMP算法(KMPSM)、BM算法(bmSM)以及RK算法(rkSM),并分析它们的基本原理和C代码实现。 1. **平凡算法(SimpleSM)** 平凡算法是最基础的...
KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和 Vaughan Pratt三位学者在1970年代提出。该算法在处理字符串匹配问题时,避免了不必要的回溯,极大地提高了...
本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为“部分匹配表”或...
这里我们将深入探讨几种常见的字符串匹配算法,包括Brute Force算法、KMP算法、Horspool算法以及Boyer-Moore算法。 1. **Brute Force算法**:这是最直观的字符串匹配方法,也被称为简单匹配。它将模式串与匹配串...