`
zfh521
  • 浏览: 31415 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于KMP算法求两个字符串的最大公共子字符串

阅读更多

在维基百科中对这个算法的介绍是:

在计算机科学中,Knuth-Morris-Pratt 字符串查找算法(常简称为 “KMP算法”)可在一个主“文本字符串” S 内查找一个“词” W 的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。

这个算法是由高德纳(Donald Ervin Knuth)和 沃恩·普拉特 在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终由三人于1977年联合发表。

 基于这个算法,当我们来描述求解两个字符串包含的最大公共子字符串。我们将较长的字符串作为主字符串(L),较短的字符串为匹配字符串(S)

   用L[m]与S[0]比较,如果L[m]!=S[0],在用L[m]与S[1]比较,如果L[m]!=S[1],再用L[m]与S[2]比较。直到匹配到L[m]==S[n],然后再用L[m+1]于S[n+1]比较,如果L[m+1]==S[n+1],在用L[m+2]与S[n+2]比较。直到匹配到L[m+x]!=S[n+x]或者length(L)==m+x||length(S)==n+x(达到边界,即两个字符串有一个匹配到了结尾)。那么这时我们匹配到L与S的一个长度为x的公共子字符串。然后继续用L[m]与S[n+1]比较。

重复上述的步骤,直到L匹配到边界。实现如下:

 

  

public String getLargestPatch(char[] longerStrArray,char[] shorterStrArray){
		int startIndex=0;
		int endIndex=0;
		int tmpStartIndex=0;
		for(int i=0;i<longerStrArray.length;i++){
			int x=i;
			if(i==9){
				System.out.println();
			}
			for(int j=0;j<shorterStrArray.length&x<longerStrArray.length;j++,x++){
				if(longerStrArray[x]==shorterStrArray[j]){
					int m=x;int n=j;
					tmpStartIndex=m;
					for(;m<longerStrArray.length&&n<shorterStrArray.length;m++,n++){
						if(((m+1)==longerStrArray.length||(n+1)==shorterStrArray.length)||longerStrArray[m]!=shorterStrArray[n]){
							if(m-tmpStartIndex>endIndex-startIndex){
								startIndex=tmpStartIndex;
								endIndex=m;
							}
							break;
						}
					}
				}
				
			}
		}
		return new String(longerStrArray,startIndex,endIndex-startIndex+1);
	}

 

 

 

 

 

 

 

0
2
分享到:
评论
4 楼 zfh521 2014-11-07  
cywhoyi 写道
zfh521 写道
cywhoyi 写道
KMP又叫看毛片算法

高人,看毛片都能看出算法来!

记得那时给大家分享KMP算法时,用google拼音,打出来KMP,联想到看毛片,那个囧。
回归算法本身,希望能够帮助到你
1.KMP算法最重要的是KMP TABLE,即next函数,在code中一丁点都未发现
2.KMP算法是解决回溯问题,本身哪怕是贪心算法也就,O(N*N),你的代码是O(N*N*N),KMP是O(M+N),你这段代码有问题吧

KMP算法是在在句子中查找单词的位置,本例借用了KMP算法的思想。不知道是不是用错了!
3 楼 cywhoyi 2014-11-07  
zfh521 写道
cywhoyi 写道
KMP又叫看毛片算法

高人,看毛片都能看出算法来!

记得那时给大家分享KMP算法时,用google拼音,打出来KMP,联想到看毛片,那个囧。
回归算法本身,希望能够帮助到你
1.KMP算法最重要的是KMP TABLE,即next函数,在code中一丁点都未发现
2.KMP算法是解决回溯问题,本身哪怕是贪心算法也就,O(N*N),你的代码是O(N*N*N),KMP是O(M+N),你这段代码有问题吧
2 楼 zfh521 2014-11-07  
cywhoyi 写道
KMP又叫看毛片算法

高人,看毛片都能看出算法来!
1 楼 cywhoyi 2014-11-07  
KMP又叫看毛片算法

相关推荐

    我用Python写的一些算法

    计算集合中两个元素的和和一个数相等 ##动态规划 使用分治法的最大子数组(应该算成分治法) 使用自底向上方法实现的最大子数组 使用动态规划的两种方式实现的LCS(最大公共串)(下面的算法都会使用动态规划的两种...

    常用算法代码

    | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面...

    ACM算法模板和pku代码

    两个树桩数组 二维树状数组 数据结构 双端队列 Sliding Window 数据结构 线段树 Cows 线段染色 排队问题 第K大的数 离散化+线段树 灯光投影 网络赛取连续子序列问题 线段树+树状数组+并查集,转化为排队...

    扩展KMP KMP

    KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](0),求出A[i]往前和B的前缀匹配的最大匹配长度,记为ex[i](或者说,ex[i]为满足A[i-z+1..i]==B[0..z-...

    高效算法:竞赛、应试与提高必修128例.[法] Christoph Dürr Jill-Jênn Vie(带书签文字版).pdf

    3 3 最长公共子序列 47 3 4 升序最长子序列 49 3 5 两位玩家游戏中的必胜策略 52 第 4 章 数组 53 4 1 合并已排序列表 53 4 2 区间的总和 54 4 3 区间内的重复内容 54 4 4 区间的最大总和 55 4 5 查询区间中的最小值...

    ACM 算法经典代码 数据结构经典代码

    9. 最长公共单调子序列 119 10. 最长子序列 120 11. 最大子串匹配 121 12. 最大子段和 122 13. 最大子阵和 123 常用源代码 包括很多经典算法 数学问题: 1.精度计算——大数阶乘 2.精度计算——乘法(大数乘...

    leetcode括号生成python-algs:算法和数据结构

    字符串查找算法 9:RabinKarp 指纹字符串查找算法 10:KMP 字符串查找算法加强版 11:0-1背包,完全背包,多重背包问题 leetcode 1:旋转数组 p 2: 存在重复 p 3: 只出现一次的数字 p 4: 两个数组的交集 p 5:两个...

    leetcode中国-Summer:2020暑假自学-数据结构与算法

    最大子串和,最长公共子序列,最长单调递增子序列 图论:二分图的最大匹配,如匈牙利算法(至少需要完成5道题目) 计算几何:(至少需要完成10道题目) 判断点是否在线段上 判断线段相交 判断矩形是否包含点 判断圆...

    ACM巨全模板 .pdf

    5.寻找两个字符串的最长前后缀(KMP) 6.hash(进制hash,无错hash,多重hash,双hash) 7.后缀数组 (按字典序排字符串后缀) 8.前缀循环节(KMP的fail函数) 9.AC自动机 (n个kmp) 10.后缀自动机 小技巧: 1.关于int,double强...

    全面的算法代码库

    字符串匹配(KMP) Knuth-Morris-Pratt 最小生成树(Kruskal) Kruskal 最近公共祖先(Tarjan) Least-Common-Ancestor(Tarjan) 使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log...

    leetcode切割分组-DSA-Revision:用于修改重要DSA问题的存储库

    额外空间合并两个已排序的数组 最大和连续子阵列:Kadane 算法 合并重叠子区间 设置矩阵零 帕斯卡三角 下一个排列 数组的反转:使用归并排序 股票买卖 旋转矩阵 在二维矩阵中搜索 在日志 N 中找到 n^x 多数元素(&gt;N/...

    leetcode有效期-Leetcode:力码

    个字符串。 这2个程序的结构几乎相似。 即如果当前字符匹配,则比较下一个; 否则,让 j 回到“下一个位置”。 0035 搜索插入位置 二进制搜索! 0038 数数说 只需翻译声明即可。 0053 最大子阵列 使用贪心算法得到$O...

    acm模板(全)

    5.2 最长公共子序列LCS 64 5.3 最长上升子序列/最长不下降子序列(LIS) 65 5.3.1 O(n^2) 65 5.3.2 O(nlogn) 66 5.4 Joseph问题 67 5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列...

    ACM模板(几乎全)

    5.2 最长公共子序列LCS 64 5.3 最长上升子序列/最长不下降子序列(LIS) 65 5.3.1 O(n^2) 65 5.3.2 O(nlogn) 66 5.4 Joseph问题 67 5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列...

    leetcode中国-Programing-practice-of-summer-vacation-in-2020:2020年暑假编程实践

    最大子串和,最长公共子序列,最长单调递增子序列, 图论:二分图的最大匹配,如匈牙利算法 (至少需要完成5道题目) 计算几何:(至少需要完成10道题目) 判断点是否在线段上 判断线段相交 判断矩形是否包含点 判断...

    leetcode104-goes:golangex

    找出字符串数组中最长的公共前缀。水平扫描 垂直扫描 分治法 二分查找 括号字符串检查是否配对。栈 实现substr。暴力法,kmp 查找元素在数组中的位置,如果不存在则返回插入的位置。 二分法 报数。递归 leetcode39 给...

    leetcode小白刷题-leetcode:一些LeetCode问题的解决方案

    的时间复杂度来搜索字符串中的子字符串,这真是不可思议。 关键实际上是利用嵌入在模式字符串中的信息。 53 最大子数组() 分而治之 每次将数组分成两部分,计算每部分(左右)中的最大子数组,以及跨越中间元素的...

    leetcode怎么搜索好友-DataStructure_Algorithm:用Java语言来实现数据结构和算法

    递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 学习方法 观点:学习的目的还是掌握,然后应用 边学边练,“适度”刷题 多问、多思考、多互动 打怪升级学习法 知识...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    10.9 最长公共单调子序列 202 10.10 最长子序列 204 10.11 最大子串匹配 204 10.12 最大子段和 205 10.13 最大子阵和 206 11.其它 207 11.1 大数(只能处理正数) 207 11.2 分数 212 11.3 矩阵 214 11.4 线性方程组 ...

Global site tag (gtag.js) - Google Analytics