如果不要求连续求最长公共子序列
解题思路:
找匹配的连续子数组可以暴力一点的方法逐个比对元素值
记录连续长度使用动态规划的思想,若当前A中第i个元素和B中第j个元素相同,则在原来数组中比dp[i-1][j-1]值加一,因为dp[i][j]下标对应元素相同即dp[i][j]=dp[i-1][j-1]+1,若不相同dp[i][j]=max(dp[i-1][j], dp[i][j-1])应当是这前两者中最长子序列长度值,自然这个连续子数组长度要加一
另设一个计数器,不断记录所有产生的连续子数组长度的最大值
C/C++题解:
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
//两者有一个是空数组,都没有公共子数组
vector<vector<int>> dp(A.size()+1,vector<int>(B.size()+1,0));
//dp[i][j]表示A中前i个元素和B中前j个元素最长公共子数组的长度
int result = 0;
//dp[0][0]=0,初始,第i个元素相等就记录在数组下标i上
for (int i = 1; i <= A.size(); i++) {//双循环逐个匹配
for (int j = 1; j <= B.size(); j++) {
if (A[i-1] == B[j-1]) {//开始从两数组第一个元素开始
dp[i][j] = dp[i-1][j-1]+1;//元素相同长度加一
else dp[i][j] = max(dp[i-1][j], dp[i][j-1])
//记录一个最长的数
result = max(result, dp[i][j]); }}}
return result;}};
Java题解:
class Solution {
public int findLength(int[] A, int[] B) {
//两者有一个是空数组,都没有公共子数组
int[][] dp = new int[A.length+1][B.length+1];
//dp[i][j]表示A中前i个元素和B中前j个元素最长公共子数组的长度
int result = 0;
//dp[0][0]=0,初始,第i个元素相等就记录在数组下标i上
for (int i = 1; i <= A.length; i++) {//双循环逐个匹配
for (int j = 1; j <= B.length; j++) {
if (A[i-1] == B[j-1]) {//开始从两数组第一个元素开始
dp[i][j] = dp[i-1][j-1]+1;//元素相同长度加一
else dp[i][j] = max(dp[i-1][j], dp[i][j-1])
//记录一个最长的数
result = max(result, dp[i][j]); }}}
return result;}}
Python题解:
class Solution(object):
def findLength(self, A, B):
""":type A: List[int]:type B: List[int]
:rtype: int"""
#两者有一个是空数组,都没有公共子数组
dp = [[0 for _ in range(len(B)+1)] for _ in range(len(A)+1)]
#dp[i][j]表示A中前i个元素和B中前j个元素最长公共子数组的长度
result = 0
#dp[0][0]=0,初始,第i个元素相等就记录在数组下标i上
for i in range(1,len(A)+1): #双循环逐个匹配
for j in range(1, len(B)+1):
if A[i-1] == B[j-1]: #开始从两数组第一个元素开始
dp[i][j] = dp[i-1][j-1]+1 #元素相同长度加一
#记录一个最长的数
result = max(result, dp[i][j])
return result
例题来自力扣网https://leetcode-cn.com/
欢迎评论后台留言交流~