力扣583.两个字符串的删除操作
刚看到这个题目时,感觉有点懵,读了很长时间d呃题目都没有想明白。但是感觉有点熟悉,之前做个一个单词变换的题目,就是使两个不同的字符通过最小的变化(添加/删除/替换),使得连个单词相同。当时利用了一个莱温斯坦距离,正好趁这个机会把之前的内容给复习了一下,回到这个题目,最后我的理解就是找两个字符串的最长公共子串,但是这个最长公共子串是经过删除操作的,不是一个静态的过程。在解题的过程中参考了https://leetcode-cn.com/problems/delete-operation-for-two-strings/solution/pythonjava-lcs-zui-chang-gong-gong-zi-xu-la8y/这个解答过程,里面关于动态规划的描述如下:
如果两个位置的字符相等,即word[i]=word[j],当前到i和结尾的最长公共子序列就由去掉这个字符的最长公共子序列长度构成,也就是dp[i][j]=dp[i-1][j-1]+1
如果两个位置的字符不相等,那么必然由两者之一的某一个及外围的最长公共子序列的长度构成,也就是dp[i][j]=max(dp[i][j-1],dp[i-1][j])
代码如下:
n1=len(word1) n2=len(word2) dp=[[0]*(n2+1) for _ in range (n1+1)] for j in range(1,n2+1): for i in range(1,n1+1): if word1[i-1]==word2[j-1]: dp[i][j]=dp[i-1][j-1]+1 else: dp[i][j]=max(dp[i-1][j],dp[i][j-1]) return n1+n2-dp[-1][-1]*2

浙公网安备 33010602011771号