题解 | #最长公共子序列(二)#

最长公共子序列(二)

https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# longest common subsequence
# @param s1 string字符串 the string
# @param s2 string字符串 the string
# @return string字符串
#
class Solution:
    def LCS(self , s1: str, s2: str) -> str:
        # write code here
        if len(s1)==0 or len(s2)==0:
            return "-1"
        dp = [[[-1,-1,-1] for j in range(len(s2))] for i in range(len(s1))]
        dpstr = [['' for j in range(len(s2))] for i in range(len(s1))]
        if s1[0]==s2[0]:
            dp[0][0]=[0,0,1]
            dpstr[0][0] = s1[0]
        else:
            dp[0][0] = [-1,-1,-1]
        
        for i in range(len(s1)):
            for j in range(len(s2)):
                a1this = [-1,-1,-1]
                a2this = [-1,-1,-1]
                a1str = ''
                a2str = ''

                if i>0:
                    a1 = dp[i-1][j]
                    if a1[2]!=-1:
                        if s1[i] in s2[a1[1]+1:j+1]:
                            ind = a1[1]+s2[a1[1]+1:j+1].index(s1[i])+1
                            a1this = [i,ind,a1[2]+1]
                            a1str = dpstr[i-1][j]+s1[i]
                        else:
                            a1this = a1
                            a1str = dpstr[i-1][j]
                    else:
                        if s1[i] in s2[:j+1]:
                            ind = s2[:j+1].index(s1[i])
                            a1this = [i,ind,1]
                            a1str = s1[i]
                if j>0:
                    a2 = dp[i][j-1]
                    if a2[2]!=-1:
                        if s2[j] in s1[a2[0]+1:i+1]:
                            ind = a2[0]+s1[a2[0]+1:i+1].index(s2[j])+1
                            a2this = [ind,j,a2[2]+1]
                            a2str = dpstr[i][j-1]+s2[j]
                        else:
                            a2this = a2
                            a2str = dpstr[i][j-1]
                    else:
                        if s2[j] in s1[:i+1]:
                            ind = s1[:i+1].index(s2[j])
                            a2this = [ind,j,1]
                            a2str = s2[j]

                if a1this[2]>0 and a1this[2]>a2this[2]:
                    dp[i][j]=a1this
                    dpstr[i][j] = a1str
                elif a2this[2]>a1this[2] and a2this[2]>0:
                    dp[i][j]=a2this
                    dpstr[i][j] = a2str
                elif a2this[2]==a1this[2] and a2this[2]>0:
                    dp[i][j]=a1this
                    dpstr[i][j] = a1str
                else:
                    pass
        
        if dp[-1][-1][2]!=-1:
            return dpstr[-1][-1]
        else:
            return '-1'

全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务