python 求2个字符串最长公共字符串和矩阵算法
s1="abcdefg"
s2="defabcd"
以上两个字符串求最长公共字符串,可以拿字符串s1中先一位一位取出来在s2中判断是否存在,存在并把它存在一个变量中,在两位两位取,以此类推
s1="abcdefg"
s2="cdefgabcd"
flag=""
for i in range(1,len(s1)+1):
for j in range(len(s1)-i+1):
if s1[j:j+i] in s2 and len(s1[j:j+i])>len(flag):
flag=s1[j:j+i]
改进:但是这样效率地其实可以在第一次拿一个字符从s2中找的时候找到可以保存匹配索引下次再找的时候从索引位置开始
s1="abcdefg"
s2="defabcd"
矩阵方式
从s2中每一个元素去分别和s1的每一个元素比较相同1,不同是0,位置对比生产下表格
s1 | |
---|---|
abcdefg | |
d | 0001000 |
e | 0000100 |
f | 0000010 |
a | 1000000 |
b | 0100000 |
c | 0010000 |
d | 0001000 |
看与斜对角县平行的线这个线是穿过1的那么最长的就是最长子字符串
s1[3:3+3] 3个1 3+3 3是第一个1位置
s1[0:0+4] 最长 4个1 0+4 0是第一个1位置
但是现在是用眼睛看才能一下找到最长的字符串,但是用到代码中如何找到呢
可以每次扫描一个字母是1的时候 看到这个字母是1的位置前一个前一个位置的上一个字母数+1 (上一个字母是0 他就是1)
s1 | |
---|---|
abcdefg | |
d | 0001000 |
e | 0000200 |
f | 0000030 |
a | 1000000 |
b | 0200000 |
c | 0030000 |
d | 0004000 |
def findit(str1,str2):
matrix=[] #用来存放所有矩阵数
xmax=0 #存放最长子字符串长度
xindex=0 #最长子字符串其实索引
for i ,x in enumerate(str2):
matrix.append([])
for j,y in enumerate(str1):
if y!=x: #值不相等存入0
matrix[i].append(0)
else:
if j==0 or i==0: #是不是str1 或str2的第一个数
matrix[i].append(1)
else:
matrix[i].append(matrix[i-1][j-1]+1) 用他上一个字母的上一个位置+1
if matrix[i][j]>xmax: #当前这个比之前的最长的长就替换掉
xmax=matrix[i][j]
xindex=j
xindex+=1
print(matrix)
return str1[xindex-xmax:xindex]