蓝肽子序列
原题链接:5.蓝肽子序列 - 蓝桥云课 (lanqiao.cn)
原题内容
具体参考原来的上面官网的链接。这里我们简单分析这个示例,就能知道这个意思了。
在上面的示例中,输出为2,意思是两个相同,一个是Lan,另外一个是Qiao
思路联想
其实看到这个题目心里是比较开心的,因为这个题目和模板题最长公共子序列1143. 最长公共子序列 - 力扣(LeetCode)几乎是一模一样。
相关性分析
- 在最长公共子序列中,里面是单个字符构成的公共子序列相等。
- 在蓝肽子序列中,这里等效于将每个字符换成单词啦,其他几乎是没有任何变化的。
浓缩成图
完整代码
假如我们知道这里状态转移之后,我们还需要额外处理的就是如何将单词划开。
单词划开
这里思路也比较简单,我们就是根据是否是大写字母来划开就好啦。
# 定义一个单词划分的函数
def word_split(s_1):
s1 = []
idx = 0
for i in range(len(s_1)):
if s_1[i].isupper():
if i != 0:
s1.append(s_1[idx:i])
idx = i
s1.append(s_1[idx:len(s_1)])
return s1
这里我们就是根据大写字母划开,相比大家都想到了。
下面是完整代码
s_1 = input()
s_2 = input()
# 定义一个单词划分的函数
def word_split(s_1):
s1 = []
idx = 0
for i in range(len(s_1)):
if s_1[i].isupper():
if i != 0:
s1.append(s_1[idx:i])
idx = i
s1.append(s_1[idx:len(s_1)])
return s1
s1 = word_split(s_1)
s2 = word_split(s_2)
n, m = len(s1), len(s2)
f = [[0]*(m+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, m+1):
if s1[i-1] == s2[j-1]:
f[i][j] = f[i-1][j-1] + 1
else:
f[i][j] = max(f[i][j-1], f[i-1][j])
print(f[-1][-1])
其实这个代码还可以优化,比如内存的优化。也欢迎大家在评论区留言。