1.求最大公共子串
def maxofcommonstr(str1,str2):
lstr1 = len(str1)
lstr2 = len(str2)
record = [[0 for i in range(lstr2+1)] for j in range(lstr2+1)]
p = 0
maxnum = 0
for i in range(lstr1):
for j in range(lstr2):
if str1[i]==str2[j]:
record[i+1][j+1]=record[i][j]+1
if record[i+1][j+1]>maxnum:
maxnum = record[i+1][j+1]
p = i+1
return str1[p-maxnum:p],maxnum
str1 = raw_input()
str2 = raw_input()
print maxofcommonstr(str1,str2)
2.求最大公共子序列
import numpy
def maxofcommonlist(str1,str2):
#两个二维数组,一个记录匹配情况,一个记录转移情况
m = [[0 for p in range(len(str2)+1)] for q in range(len(str1)+1)]
d = [[None for f in range(len(str2)+1)] for g in range(len(str1)+1)]
for i in range(len(str1)):
for j in range(len(str2)):
if str1[i] == str2[j]:
m[i+1][j+1] = m[i][j]+1
d[i+1][j+1] == 'ok'
elif m[i+1][j] > m[i][j+1]:
m[i+1][j+1] = m[i+1][j]
d[i+1][j+1] == 'left'
elif m[i+1][j] < m[i][j+1]:
m[i+1][j+1] = m[i][j+1]
d[i+1][j+1] == 'up'
(x,y) = (len(str1),len(str2))
print numpy.array(d)
s = []
while m[x][y]:
c = d[x][y]
if c == 'ok':
s.append(s1[x-1])
x -= 1
y -= 1
if c == 'left':
y -= 1
if c == 'up':
x -= 1
s.reverse()
return ''.join(s)
str1 = raw_input()
str2 = raw_input()
print maxofcommonlist(str1,str2)
原文链接在这里,我为了方便自己看,重新撸了一遍
(https://blog.csdn.net/u010002184/article/details/50740691)