【猿輔導】(數據開發工程師-面試)求兩個字符串的最大公共子串【Python】
題目描述
求兩個字符串的最大公共子串
示例
輸入:
asdfbdsdfdsasdf
asddsdfsaoesdf
輸出:
4
dsdf
方法一:建立一個二維數組,保存連續位相同與否的狀態
def getNumofCommonSubstr(str1, str2):
lstr1 = len(str1)
lstr2 = len(str2)
record = [[0 for i in range(lstr2 + 1)] for j in range(lstr1 + 1)] # 多一位
# print(record)
maxNum = 0 # 最長匹配長度
p = 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
# print (record)
if record[i + 1][j + 1] > maxNum:
# 獲取最大匹配長度
maxNum = record[i + 1][j + 1]
# 記錄最大匹配長度的終止位置
p = i + 1
# print (str1)
# print (p)
# print (p-maxNum)
return str1[p - maxNum:p], maxNum
if __name__ == '__main__':
str1 = input()
str2 = input()
# str1 = 'asdf'
# str2 = 'asdds'
res = getNumofCommonSubstr(str1, str2)
print (res)
方法二:遍歷不同長度的所有子串
s1 = 'asdfbdsdfdsasdf'
s2 = 'asddsdfsaoesdf'
if len(s1) > len(s2):
sx = s2
sy = s1
else:
sx = s1
sy = s2
# sx 較短
max = 0
for i in range(len(sx),0,-1):
# 由大到小遍歷子串長度
for j in range(len(sx)-i+1):
# 由左到右遍歷指定長度的子串
if sx[j:j+i] in sy:
max = i
print (max)
print (sx[j:j+i])
break
if max > 0:
break
if max == 0:
print ('無公共子串')
# print(max)