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

字符串相似性算法【最长公共字符串算法】 【LCS】

阅读更多
#!/user/bin/env python
# -*- coding: utf-8 -*-

class arithmetic():
	
	def __init__(self):
		pass
	''' 【编辑距离算法】 【levenshtein distance】 【字符串相似度算法】 '''
	def levenshtein(self,first,second):
		if len(first) > len(second):
			first,second = second,first
		if len(first) == 0:
			return len(second)
		if len(second) == 0:
			return len(first)
		first_length = len(first) + 1
		second_length = len(second) + 1
		distance_matrix = [range(second_length) for x in range(first_length)] 
		#print distance_matrix
		for i in range(1,first_length):
			for j in range(1,second_length):
				deletion = distance_matrix[i-1][j] + 1
				insertion = distance_matrix[i][j-1] + 1
				substitution = distance_matrix[i-1][j-1]
				if first[i-1] != second[j-1]:
					substitution += 1
				distance_matrix[i][j] = min(insertion,deletion,substitution)
		#print distance_matrix
		return distance_matrix[first_length-1][second_length-1]
	def lcs(self,first,second):
		first_length = len(first)
		second_length = len(second)
		size = 0
		x = 0
		y = 0
		matrix = [range(second_length) for x in range(first_length)]
		#print matrix
		for i in range(first_length):
			for j in range(second_length):
				#print i,j
				if first[i] == second[j]:
					if i - 1 >= 0 and j - 1 >=0:
						matrix[i][j] = matrix[i-1][j-1] + 1
					else:
						matrix[i][j] = 1
					if matrix[i][j] > size:
						size = matrix[i][j]
						x = j
						y = i
				else:
					matrix[i][j] = 0
		#print matrix
		#print size,x,y 

		return second[x-size+1:x+1]
	
if __name__ == "__main__":
	arith = arithmetic()
	print arith.levenshtein('GUMBOsdafsadfdsafsafsadfasfadsfasdfasdfs','GAMBOL00000000000dfasfasfdafsafasfasdfdsa')
	print arith.lcs('GUMBOsdafsadfdsafsafsadfasfadsfasdfasdfs','GAMBOL00000000000dfasfasfdafsafasfasdfdsa')

#Longest Common String 【最长公共字符串算法】
	def lcs(self,first,second):
		first_length = len(first) #the first string's length
		second_length = len(second)#the second string's length
		size = 0 #length of the max string
		x = 0
		y = 0
				
		li = [0 for x in range(second_length)]
		for i in range(first_length):
			temp = li
			print temp
			li = [0 for x in range(second_length)]
			for j in range(second_length):
				if first[i] == second[j]:
					if i - 1 >= 0 and j - 1 >=0:
						li[j] = temp[j-1] + 1 #matrix[i][j] = matrix[i-1][j-1] + 1 
					else:
						li[j] = 1
					if li[j] > size:
						size = li[j] # max length
						x = j # X-axis
						y = i # Y-axis
				else:
					li[j] = 0

		#print size,x,y
		return second[x-size+1:x+1]
	
 

 

参考:http://henryouly.blogspot.com/2006/10/blog-post_895.html

http://space.itpub.net/16857/viewspace-79033

http://hellobmw.com/archives/dynamic-programming-longest-common-substring.html

http://en.wikipedia.org/wiki/Longest_common_substring_problem

http://www.allisons.org/ll/AlgDS/

 

 

分享到:
评论

相关推荐

    字符串相似度比较算法

    LCS 是两个字符串中最长的公共子序列的长度。它不关心字符的相对位置,只关注子序列的长度。LCS 通常用于比较长文本的相似性。 6. **余弦相似度**: 通过计算两个字符串的词袋模型向量之间的夹角余弦值来衡量相似...

    DELPHI 计算两个字符串相似度 LCS算法(附源代码)

    本篇文章将深入探讨如何使用DELPHI编程语言实现LCS(最长公共子序列)算法来衡量两个字符串的相似度。LCS算法是一种找出两个序列中最长的相同子序列的算法,它不考虑子序列的顺序,对于字符串而言,就是找到最长的...

    Delphi计算字符串的相似度

    5. **最长公共子序列(Longest Common Subsequence, LCS)**:找到两个字符串中的最长子串,它们在各自的字符串中都存在,但不一定连续。LCS的长度可以作为相似度的一个度量。 在Delphi中实现这些算法,你需要理解...

    lcs.rar_LCS_LCS算法_Lcs.rar_最长公共子序列

    LCS算法在多个领域都有应用,包括但不限于生物信息学(对比DNA或蛋白质序列)、文本编辑距离计算(衡量两个文本的相似性)、版本控制系统(比较文件的差异)等。了解并掌握LCS算法对于理解和解决这类问题至关重要。...

    最长公共子序列算法C#实现

    最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一种经典的问题,主要应用于比较和分析两个或多个序列的相似性。在这个问题中,目标是找到两个序列的最长子序列,这个子序列不需要在原序列中...

    使用Java实现的计算两字符串相似度+最长公共子序列.zip

    在这个项目中,我们关注的是基于LCS的相似度计算,因为LCS可以直观地反映出两个字符串共享的最长连续子串长度,从而反映它们的相似性。 最长公共子序列问题定义如下:给定两个字符串S1和S2,找到一个非空字符串Z,...

    Python-使用Python实现不同的字符串相似性和距离度量的库

    在Python编程语言中,处理字符串相似性和距离度量是一个常见的任务,特别是在文本分析、自然语言处理(NLP)以及信息检索等领域。这个压缩包“luozhouyang-python-string-similarity-b688fd7”可能包含了一些用于...

    最长公共子序列LCS算法

    最长公共子序列(Longest Common Subsequence,LCS)算法是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在文本编辑、生物信息学、数据挖掘等领域有着广泛的应用。LCS问题的基本目标是...

    C++求最长公共子序列

    总之,LCS算法不仅体现了动态规划的强大功能,也展示了其在实际问题解决中的广泛应用,特别是在数据对比和相似性分析领域。对于学习计算机科学和编程的学生来说,掌握LCS算法及其背后的动态规划思想是非常有价值的。

    字符串问题详解

    常见的字符串处理包括查找、替换、连接、插入和删除等基本操作,而更深入的算法如最长公共子序列(LCS)和最长公共子串(LIS)则是研究字符串相似性的基础。字符串相似度度量算法如Levenshtein距离提供了一种衡量两个...

    C++ lcs 最长公共子序列源程序及实验报告

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要应用于比较两个序列的相似性。在这个C++算法实验中,我们关注的是如何找到两个字符串之间的最长公共子序列,而不仅仅是...

    字符串识别,相似度匹配

    - **Boost**: 提供了`boost::algorithm`库,包含字符串算法如`find_similar()`用于模糊匹配。 - **SeqAn**: 一个专门针对生物信息学序列处理的高性能库,但其算法也适用于一般字符串的相似度计算。 - **AC自动机...

    LcsLength.rar_最长 公共子序列 算法_最长公共子序列

    最长公共子序列(Longest Common Subsequence,LCS)算法是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在本实验作业中,我们将关注两个字符串之间的LCS,这是一个基础且重要的算法,它...

    LCS.rar_LCS_lcs algorithm_最长公共子序列

    最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一种经典的问题,主要涉及字符串或序列的比较。在本压缩包文件"LCS.rar"中,包含了一个名为"LCS"的程序,该程序可能用C++实现了KMP算法来解决...

    最长公共子序列

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要应用于比较两个或多个序列的相似性。在本压缩包中,提供的源码是基于C语言实现的LCS算法,适用于VC6.0编译环境。 首先...

    lcs_最长公共子序列_

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要应用于比较和分析两个或多个序列的相似性。在文本编辑、生物信息学、数据比对等领域有广泛应用。LCS 不关注序列的位置...

    c c++最长公共子序列 实现算法

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要应用于比较和分析两个或多个序列的相似性。在C++中实现LCS算法,通常采用动态规划的方法来解决。这里我们将深入探讨LCS...

    最长公共子序列算法试验报告

    总的来说,最长公共子序列算法是一种基于动态规划的经典算法,适用于解决多个序列之间的相似性问题。在这个实验中,我们学习了如何运用动态规划来找到两个字符串的最长公共子序列,加深了对动态规划思想的理解,并...

    C#写的LCS算法

    最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在本场景中,我们关注的是使用C#编程语言来实现这一算法。C#是Microsoft开发的一...

Global site tag (gtag.js) - Google Analytics