蓝桥杯2020年国赛的模板题——蓝肽子序列

蓝肽子序列

原题链接:5.蓝肽子序列 - 蓝桥云课 (lanqiao.cn)

原题内容

具体参考原来的上面官网的链接。这里我们简单分析这个示例,就能知道这个意思了。

在上面的示例中,输出为2,意思是两个相同,一个是Lan,另外一个是Qiao


思路联想

其实看到这个题目心里是比较开心的,因为这个题目和模板题最长公共子序列1143. 最长公共子序列 - 力扣(LeetCode)几乎是一模一样。

相关性分析

  1. 最长公共子序列中,里面是单个字符构成的公共子序列相等。
  2. 蓝肽子序列中,这里等效于将每个字符换成单词啦,其他几乎是没有任何变化的。

浓缩成图


完整代码

假如我们知道这里状态转移之后,我们还需要额外处理的就是如何将单词划开。

单词划开

这里思路也比较简单,我们就是根据是否是大写字母来划开就好啦。

# 定义一个单词划分的函数
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])

其实这个代码还可以优化,比如内存的优化。也欢迎大家在评论区留言。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值