当前位置: 面试刷题>> 最长重复子序列 (经典算法题500道)


### 题目描述补充 题目:**最长重复子序列(Longest Common Subsequence, LCS)** 给定两个字符串 `text1` 和 `text2`,找出这两个字符串中最长的公共子序列(不一定连续)的长度。一个字符串的子序列是指从一个字符串中删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。 **示例**: - 输入:`text1 = "abcde"`, `text2 = "ace"` - 输出:3 - 解释:最长公共子序列是 "ace",所以它的长度为 3。 ### PHP 示例代码 ```php function longestCommonSubsequence($text1, $text2) { $m = strlen($text1); $n = strlen($text2); // 创建一个二维数组来保存子问题的解 $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); // 填充dp表 for ($i = 1; $i <= $m; $i++) { for ($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]; } // 测试代码 echo longestCommonSubsequence("abcde", "ace"); // 输出: 3 ``` ### Python 示例代码 ```python def longestCommonSubsequence(text1, text2): m, n = len(text1), len(text2) # 创建一个二维数组来保存子问题的解 dp = [[0] * (n + 1) for _ in range(m + 1)] # 填充dp表 for i in range(1, m + 1): for j in range(1, n + 1): 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] # 测试代码 print(longestCommonSubsequence("abcde", "ace")) # 输出: 3 ``` ### JavaScript 示例代码 ```javascript function longestCommonSubsequence(text1, text2) { const m = text1.length; const n = text2.length; // 创建一个二维数组来保存子问题的解 const dp = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0)); // 填充dp表 for (let i = 1; i <= m; i++) { for (let 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] = Math.max(dp[i - 1][j], dp[i][j - 1]); } } } // 返回最长公共子序列的长度 return dp[m][n]; } // 测试代码 console.log(longestCommonSubsequence("abcde", "ace")); // 输出: 3 ``` 码小课网站中有更多关于算法和数据结构的内容分享给大家学习,欢迎大家访问学习更多知识!
推荐面试题