动态规划的思路:只要涉及子序列的问题,十有八九要用动态规划来解决。
一、要明确dp数组的含义。因为有两个字符串,所以需要一个二维数组。dp[i][j] 的含义就是字符串1的下标为0到i的子串与字符串2的下标为0-j的字串的最长公共子序列的长度。
二、就是要确定好base case。空串与任何串的公共子序列的长度都是0。
三、找状态转移方程。我们知道,如果在字符串1与字符串2的末尾都加上一个相同的字符,那么它们的最长公共子序列的长度就会增加1。如果加上的字符不相同,那么dp[i][j] 的值应该是某些值的一个最大值。
四、我们要的就是dp[s1.size()][s2.size()]。
得出以下代码: