尋找公共子串,python
阿新 • • 發佈:2020-09-07
s1='abcdefg'
s2='efgabcd'
s3='zdxc'
s4='mn'
def findcom(str1,str2):
if len(str1)>len(str2):
str1,str2=str2,str1
commonstr=[]
flag=False
count=0
for sublen in range(len(str1),0,-1):
for b in range(0,len(str1)-sublen+1): # b記錄子串的索引開始位置
count +=1
substr=str1[b:b+sublen]
if str2.find(substr) > -1:
commonstr.append(substr)
print('count={} sublen={}'.format(count,sublen))
flag=True
if flag:
return commonstr
return 'no common substr '
s1='abcdefgaa'
s2='defgabc'
def findcom(str1,str2):
xmax=0 # 記錄最大的值,即最大的字串長度
xindex=0 # 記錄最大值的索引位置
matrix=[]
for y,yitem in enumerate(str2):
matrix.append([]) # 每次對str2迭代,生成新的子列表儲存比對結果
for x,xitem in enumerate(str1):
if xitem != yitem:
matrix[y].append( 0) # 矩陣比較中,元素不同,置矩陣元素為0
else:
if x==0 or y==0: # 對處於矩陣第一行,第一列的直接置1,防止索引超界
matrix[y].append(1)
else:
matrix[y].append(matrix[y-1][x-1]+1) # 左上角的值+1
if matrix[y][x] > xmax: # 此輪中最大的字串長度超過記錄值
xmax=matrix[y][x]
xindex=x # 最大值的索引位置
return str1[xindex+1-xmax:xindex+1] # xindex+1因為後開特性,xindex+1後需往前回溯3個位置
print(findcom(s1,s2))