网站内链规划,做隐私的网站,定制戒指,洛阳网站建设优化案例题目描述#xff1a;
给定两个字符串 text1 和 text2#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 #xff0c;返回 0 。
一个字符串的 子序列 是指这样一个新的字符串#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…题目描述
给定两个字符串 text1 和 text2返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 返回 0 。
一个字符串的 子序列 是指这样一个新的字符串它是由原字符串在不改变字符的相对顺序的情况下删除某些字符也可以不删除任何字符后组成的新字符串。
例如ace 是 abcde 的子序列但 aec 不是 abcde 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 示例 1
输入text1 abcde, text2 ace
输出3
解释最长公共子序列是 ace 它的长度为 3 。示例 2
输入text1 abc, text2 abc
输出3
解释最长公共子序列是 abc 它的长度为 3 。示例 3
输入text1 abc, text2 def
输出0
解释两个字符串没有公共子序列返回 0 。提示
1 text1.length, text2.length 1000text1 和 text2 仅由小写英文字符组成。
思路
本题采用动态规划的思想是一道很经典的动态规划问题我们把查找公共子序列问题一步一步压缩成最小子问题。创建dp表写出状态转移方程本题难点在于如何求出状态转移方程。
首先第一种情况当最后一个字符相同时我们只要比较前n-1个字符第二种情况当最后一个字符不同时我们将一个字符串的最后一位相前移动一个比较。
如图 然后代码实现时注意细节我们dp表要创建的是m1和n1的大小好进行初始化。
代码实现
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int mtext1.size();int ntext2.size();vectorvectorint dp(m1,vectorint(n1,0));for(int i1;im1;i){for(int j1;jn1;j){if(text1[i-1]text2[j-1])dp[i][j]dp[i-1][j-1]1;elsedp[i][j]max(dp[i-1][j],dp[i][j-1]);}}return dp[m][n];}
};