0
点赞
收藏
分享

微信扫一扫

【蓝桥杯】【python】蓝肽子序列-烂尾楼求助帖

未定义变量 2022-02-19 阅读 18

题目描述

在这里插入图片描述

算法思路

用数字来等效理解:

两串每个数都不同的数字,例如“123456”和“3495678”,在允许间隔的条件下,寻找其中相同子排序方式,就是“3456”。

首先将“蛋蓝质”按照大写开头分割成每个部分以蛋蓝质存放在两个列表里面,然后可以按照寻找两个字符串之间最长的公共子序列的做法:

建立一个大小为 n * m 的二维数组dp,其中dp[ i ] [ j ]代表当第一个序列取到第i个元素,第二个序列取到第j个序列的时候,可以取到的最长公共子序列。

这是我找的一篇推文:

https://blog.csdn.net/weixin_44084434/article/details/90266466

这篇文章讲查找最长子序列的原理讲的很好

算法源码

我这边呢是一个烂尾楼,我实在找不到到底bug出在哪里,所以下面附上代码,求一个有缘人帮忙一下,如果我自己看懂了也第一时间改正。

import string

# 用以将字符串按照大写开头分割
def optimize(n):

    pos = []
    sequence = []
    
    for i in range(len(n)):
        if(ord(n[i]) >= 65 and ord(n[i]) <= 90):
            pos.append(i)
        else:
            continue

    pos.append(len(n)) # 添加末尾的位置
        
    for j in range(len(pos) - 1):
        sequence.append(n[pos[j] : pos[j + 1] : 1])

    return(sequence)

# main
str_1 = input()
str_2 = input()
sequence_1 = optimize(str_1)
sequence_2 = optimize(str_2)

# 寻找最长子序列
n = len(sequence_1)
m = len(sequence_2)
dp = [[0 for _ in range(m)] for _ in range(n)]
for i in range(1, n):
    for j in range(1, m):
        if(sequence_1[i] == sequence_2[j]):
            dp[i][j] = dp[i - 1][j - 1] + 1
        else:
            dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])

print(dp[n - 1][m - 1])

举报

相关推荐

0 条评论