题目概览给定两个字符串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仅由小写英文字符组成。来源1143. 最长公共子序列 - 力扣LeetCode解题分析方法动态规划用 i 表示在 text1 遍历的位置j 表示在 text2 遍历的位置用二维数组 dp 存储结果那么当 text1[ i ] text2[ j ] 时说明存在公共序列那么就看 i - 1 和 j - 1 的最长公共序列 1即 dp[ i ][ j ] dp[ i-1 ][ j-1 ] 1当 text1[ i ] ! text2[ j ] 时最长公共序列就是和取前面一个的最大值即 dp[ i ][ j ] max { dp[ i-1 ][ j ], dp[ i ][ j-1 ]}根据以上方程遍历即可。时间复杂度O(mn)空间复杂度O(mn)class Solution { public int longestCommonSubsequence(String text1, String text2) { int m text1.length(), n text2.length(); int[][] dp new int[m 1][n 1]; for (int i 1; i m; i) { for (int j 1; j n; j) { if (text1.charAt(i-1) text2.charAt(j-1)) { dp[i][j] dp[i-1][j-1] 1; } else { dp[i][j] Math.max(dp[i-1][j], dp[i][j-1]); } } } return dp[m][n]; } }