'''
解题思路:
动态规划算法,
dp[i][j]定义为:str1在索引i处,str2在索引j处,存在公共子串的最大长度(即至少存在str1[i]==str2[j])
需要记录所有的ij处存在公共子串的最大长度,及对应的i或j(子串终点)
1、当i==0 | j==0:
(a)当str1[i] == str2[j],dp[i][j] = 1
2、其它情况:
(b)当str1[i] == str2[j],dp[i][j] = dp[i-1][j-1] + 1
#=============================================================================================
'''
#
# longest common substring
# @param str1 string字符串 the string
# @param str2 string字符串 the string
# @return string字符串
#
class Solution:
def LCS(self , str1 , str2 ):
# write code here
r = len(str1)
c = len(str2)
dp = [[0]*c for _ in range(r)]
maxlen = 0
endstr1 = 0
for i in range(r):
for j in range(c):
if (i==0 or j==0):
if str1[i]==str2[j]:
dp[i][j] = 1
else:
if str1[i]==str2[j]:
dp[i][j] = dp[i-1][j-1]+1
if dp[i][j]>maxlen:
maxlen = dp[i][j]
endstr1 = i
#for i in dp:
# print(i)
if maxlen>0:
return str1[endstr1-maxlen+1:endstr1+1]
str1 = '1AB2345CD'
str2 = '12345EF'
s = Solution()
print(s.LCS(str1,str2))