最长公共子串- LCS 算法
【摘要】 LCS (Longest Common Subsequence) 算法已知字符串str1="网站高并发解决方案",str2="如何解决网站高并发",如何字符串最长公共子串?lcs 算法原理将2个字符串采用行列 排列:如何解决网站高并发网站高并发解决方案如果行列里面的字符相同,则表示1,否则为0:如何解决网站高并发网000010000站000001000高000000100并000000010...
LCS (Longest Common Subsequence) 算法
已知字符串str1="网站高并发解决方案",str2="如何解决网站高并发",如何字符串最长公共子串?
lcs 算法原理
将2个字符串采用行列 排列:
|
如 |
何 |
解 |
决 |
网 |
站 |
高 |
并 |
发 |
---|---|---|---|---|---|---|---|---|---|
网 |
|
|
|
|
|
|
|
|
|
站 |
|
|
|
|
|
|
|
|
|
高 |
|
|
|
|
|
|
|
|
|
并 |
|
|
|
|
|
|
|
|
|
发 |
|
|
|
|
|
|
|
|
|
解 |
|
|
|
|
|
|
|
|
|
决 |
|
|
|
|
|
|
|
|
|
方 |
|
|
|
|
|
|
|
|
|
案 |
|
|
|
|
|
|
|
如果行列里面的字符相同,则表示1,否则为0:
|
如 |
何 |
解 |
决 |
网 |
站 |
高 |
并 |
发 |
---|---|---|---|---|---|---|---|---|---|
网 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
站 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
高 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
并 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
发 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
解 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
决 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
方 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
案 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
同时我们可以优化: 很明显,通过坐标可看到,相同的坐标已经标位1,通过计算连续对角线长度,即可比对出最长字符串.
如果行列里面的字符不相同,则表示为0,否则表示为 该坐标左上角的值后再加1:
|
如 |
何 |
解 |
决 |
网 |
站 |
高 |
并 |
发 |
---|---|---|---|---|---|---|---|---|---|
网 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
站 |
0 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
高 |
0 |
0 |
0 |
0 |
0 |
0 |
3 |
0 |
0 |
并 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
4 |
0 |
发 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
5 |
解 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
决 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
方 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
案 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
在判断字符串时,记录当前最大值与当前最大值坐标,判断完毕之后,即可通过记录的最大坐标获取到最长字符串最后的坐标值
python实现算法:
#!/usr/bin/python
# coding:utf-8
def action (str1,str2):
pass
#转为utf-8编码,一个中文字长度占用1
str1 = str1.decode("utf-8")
str2 = str2.decode("utf-8")
data = {}
maxNum = 0
maxLocation = []
#根据长度遍历2个字符串
for i in range(len(str1)):
for j in range(len(str2)):
v1 = str1[i]
v2 = str2[j]
#如果v1等于v2,则该坐标值+1
if v1==v2 :
if data.has_key(i)==False:
data[i] = {}
data[i][j] = 1;
# 判断上一个斜线是否已经是相等了,如果是,则增加上上次的值
if (data.has_key(i-1)) and (data[i-1].has_key(j-1)) :
data[i][j] += data[i-1][j-1]
# 修改最大坐标跟最大数值
if data[i][j]>maxNum:
maxNum = data[i][j]
maxLocation = [i,j]
str = ""
i = maxLocation[0]
j = maxLocation[1]
while True :
if i<0 or j<0:
break
if (data.has_key(i)==False) or (data[i].has_key(j)==False) :
break
str = str1[i]+str
print i,j
i-=1
j-=1
print str,data
result = action("123231aaa测试","12aa测试")
复制
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)