甘肃省建设工程网上投标网站,wordpress自适应视频,福建省住房和城乡建设厅官方网站,做网站要求题目
给定两个字符串 text1 和 text2#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 #xff0c;返回 0 。
一个字符串的 子序列 是指这样一个新的字符串#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符#xff08;…题目
给定两个字符串 text1 和 text2返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 返回 0 。
一个字符串的 子序列 是指这样一个新的字符串它是由原字符串在不改变字符的相对顺序的情况下删除某些字符也可以不删除任何字符后组成的新字符串。 示例 1 输入text1 “abcde”, text2 “ace” 输出3 解释最长公共子序列是 “ace” 它的长度为 3 。 原题链接https://leetcode.cn/problems/longest-common-subsequence/description/
思路
以 dp[i][j] 表示text1[0:i] 和 text2[0:j] 的最长公共子序列长度。
找转移方程 当 text[i] text[j] 时即两个子字符串末尾的字符相同时dp[i][j] dp[i-1][j-1] 1。 当 text[i] ! text[j] 时dp[i][j] max(dp[i-1][j], dp[i][j-1])。
找边界条件 当 i0 或 j0 时显然可得 dp[i][0]、dp[0][j] 0
代码
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m text1.size();int n text2.size();vectorvectorint dp(m1, vectorint (n1, 0));// if text1[i-1] text2[j-1], dp[i][j] dp[i-1][j-1] 1// else, dp[i][j] max(dp[i][j-1], dp[i-1][j])for (int i 0; i m; i) {dp[i][0] 0;}for (int j 0; j n; j) {dp[0][j] 0;}for (int i 1; i m; i) {for (int j 1; j n; j) {if (text1[i - 1] text2[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 dp[m][n];}
};