【猿辅导】(数据开发工程师-面试)求两个字符串的最大公共子串【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)