while True: try: a=input() b=input() m = a if len(a)<len(b) else b # m 是短的字符,它的长度为下面的lm,将充当bp二维list的行数 n = b if len(a)<len(b) else a # n 是短的字符,它的长度为下面的ln,将充当bp二维list的列数 lm = len(m) ln = len(n) bp= [ [0]*(ln+1) for _ in range(lm+1) ] max_len = 0 # substring的长度初始为0 end_idx = 0 # substring的末尾字符,在较短的字符串m中index值 for i in range(lm): # 对短字符中的每一个index,实际上等于二维bp表的行维度向下遍历 for j in range(ln): # 对长字符中的每一个index,实际上等于二维bp表的列维度向右边遍历 if m[i] == n[j]: # 如果对应字符串中的字符是一样的 bp[i+1][j+1] = bp[i][j]+1 # 那么对于表中 [i+1][j+1]位置填充入它左上角值+1 if bp[i+1][j+1]>max_len: # 每次填充完都去判断是否刷新了最长的substring长度 max_len = bp[i+1][j+1] # 若刷新了,则将刷新的更新至max_len end_idx = i # 同时,记录一下此时遍历的i的值,赋给end_idx print( m[ end_idx+1-max_len : end_idx+1 ] ) # 输出结果,如 apple中的pple,长度为4,末尾的index在apple中为4,我们知道当slicing一个list的时候是左闭右开的,所以我们如果要最后能够取到index为4的元素,我们右边必须用5,扣除长度4,那么结果就是 'apple'[5-4,5],或者说 'apple'[4+1-4,4+1] except: break