一、题目描述
求两个字符串s1和s2的最长公共子序列。
这里说明下,子序列是可以不连续字符按顺序组成的字符串。比如字符串democrat的其中一个子序列是dmat。而mdat就不是它的子序列,因为字符出现顺序不符合。
示例:
输入:s1 = "democrat" s2 = "republican"
输出:eca
二、解题思路
其实本题就是字符串编辑距离的变种,字符串编辑距离会了,此题就会了。就是字符串编辑距离去掉替换操作,就变成了此问题。
1. 定义状态
设dp[i][j]表示字符串s1的前i个字符与字符串s2前j个字符的最长公共子序列。
2. 定义状态转移方程
当s1[i] == s2[j]时,有 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i-1][j-1] + 1 dp[i][j]=dp[i−1][j−1]+1
否则 d p [ i ] [ j ] = m a x { d p [ i − 1 ] [ j ] d p [ i ] [ j − 1 ] dp[i][j] = max\begin{cases} dp[i-1][j] \\ dp[i][j-1] \end{cases} dp[i][j]=max{ dp[i−1][j]dp[i][j<

本文探讨了如何使用动态规划解决字符串的最长公共子序列问题,并通过实例展示了算法实现过程。此外,还介绍了如何将此思路应用于找到给定字符串的最长回文子序列,提供了相应的代码实现和执行结果。文章最后提出了一个关于寻找字符串最长回文子序列的问题,鼓励读者进行思考和拓展。

1万+

被折叠的 条评论
为什么被折叠?



