首页 > 试题广场 >

最长公共子序列(一)

[编程题]最长公共子序列(一)
  • 热度指数:3292 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个字符串 s1 和 s2,长度为m和n 。求两个字符串最长公共子序列的长度。
所谓子序列,指一个字符串删掉部分字符(也可以不删)形成的字符串。例如:字符串 "arcaea" 的子序列有 "ara" 、 "rcaa" 等。但 "car" 、 "aaae" 则不是它的子序列。
所谓 s1 和 s2 的最长公共子序列,即一个最长的字符串,它既是 s1 的子序列,也是 s2 的子序列。
数据范围 : 。保证字符串中的字符只有小写字母。
要求:空间复杂度 O(n),时间复杂度
进阶:空间复杂度 O(n),时间复杂度 
示例1

输入

"abcde","bdcaaa"

输出

2

说明

最长公共子序列为 "bc" 或 "bd" ,长度为2   
示例2

输入

"abc","xyz"

输出

0
class Solution {
public:
//给一个dp[i][j]  i当成s1当前长度,j为s2当前长度。
    int LCS(string s1, string s2) {
        vector<vector<int>>dp(s1.size()+1,vector<int>(s2.size()+1,0));
        int n1=s1.size(),n2=s2.size();
        for(int i=1;i<=n1;i++)
        {
            for(int j=1;j<=n2;j++)
                if(s1[i-1]!=s2[j-1])
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            else dp[i][j]=dp[i-1][j-1]+1;
        }
        return dp[n1][n2];
    }
}; 
理解不了这个转换方程dp[i][j]=max(dp[i-1][j],dp[i][j-1]) 就去分析我图里圈起来的两个数据。第一个圈继承左边状态,第二个圈继承上边状态。
发表于 2022-01-05 22:43:07 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# s1和s2最长公共子序列的长度
# @param s1 string字符串 
# @param s2 string字符串 
# @return int整型
#
class Solution:
    def LCS(self , s1: str, s2: str) -> int:
        # write code here
        dp = [[0 for i in range(len(s2) + 1)] for j in range(len(s1) + 1)]

        for i in range(1, len(s1) + 1):
            for j in range(1, len(s2) + 1):
                if s1[i-1] == s2[j-1]:
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1] + 1)
                else:
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])

        return dp[-1][-1]

发表于 2024-04-29 20:41:09 回复(0)
class Solution {
public:
    int LCS(string s1, string s2) {
        int sz1 = s1.size();
        int sz2 = s2.size();
        vector<vector<int>> dp(sz1 + 1, vector<int>(sz2 + 1));

        for (int i = 1; i <= sz1; ++i)
            for (int j = 1; j <= sz2; ++j)
                if (s1[i-1] == s2[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[sz1][sz2];
    }
};


发表于 2023-03-10 19:42:35 回复(0)
package main
import _"fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * s1和s2最长公共子序列的长度
 * @param s1 string字符串 
 * @param s2 string字符串 
 * @return int整型
*/
func LCS( s1 string ,  s2 string ) int {
    m,n:=len(s1),len(s2)
    mat:=make([][]int,m+1)
    for i,_:=range mat{
        mat[i]=make([]int,n+1)
    }
    for i:=0;i<m;i++{
        for j:=0;j<n;j++{
            if s1[i]==s2[j]{
                mat[i+1][j+1]=mat[i][j]+1
            }else{
                mat[i+1][j+1]=max(mat[i][j+1],mat[i+1][j])
            }
        }
    }
    return mat[m][n]
}

func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}

发表于 2023-03-08 08:43:01 回复(0)
又遇到了牛客用例不全的情况,第一次写错也通过了,捂脸。。。
发表于 2023-02-04 18:15:57 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * s1和s2最长公共子序列的长度
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @return int整型
     */
    public int LCS (String s1, String s2) {
        // write code here
        int maxLen=Math.max(s1.length(),s2.length())+1;
        int[][] f=new int[maxLen][maxLen];
        char[] chars1=new char[maxLen];
        char[] chars2=new char[maxLen];
        for(int i=0;i<maxLen;i++){
            if(i<s1.length()){
                chars1[i+1]=s1.charAt(i);
            }
            if(i<s2.length()){
                chars2[i+1]=s2.charAt(i);
            }
        }
        for(int i=1;i<=s1.length();i++){
            for(int j=1;j<=s2.length();j++){
                f[i][j]=Math.max(f[i-1][j],f[i][j-1]);
                if(chars1[i]==chars2[j]){
                    f[i][j]=Math.max(f[i][j],f[i-1][j-1]+1);
                }
            }
        }
        return f[s1.length()][s2.length()];

    }
}

发表于 2022-10-09 23:51:55 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * s1和s2最长公共子序列的长度
     * @param s1 string字符串
     * @param s2 string字符串
     * @return int整型
     */
    public int LCS (String s1, String s2) {
        // write code here
        int[][] dp = new int[s1.length() + 1][s2.length() + 1];

        for (int i = 1; i < s1.length() + 1; i ++) {
            for (int j = 1; j < s2.length() + 1; j ++) {
                if (s1.charAt(i - 1) == s2.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[s1.length()][s2.length()];
    }
}

发表于 2022-09-13 12:26:24 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * s1和s2最长公共子序列的长度
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @return int整型
     */
    int LCS(string s1, string s2) {
        int m=s1.length();
        int n=s2.length();
        vector<vector<int>>dp(m+1,vector<int>(n+1));
        for(int i=1;i<=m;++i){
            for(int j=1;j<=n;++j){
                if(s1[i-1]==s2[j-1]){
                    dp[i][j]=1+dp[i-1][j-1];
                }else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[m][n];
    }
};

发表于 2022-04-26 10:01:11 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * s1和s2最长公共子序列的长度
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @return int整型
     */
    int LCS(string s1, string s2) {
        // write code here
        int m = s1.size();
        int n = s2.size();
        int dp[m+1][n+1];
        memset(dp, 0, (m+1)*(n+1)*sizeof(int));
        for (int i=1; i<=m; i++) {
            for (int j=1; j<=n; j++) {
                if (s1[i-1] == s2[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];
    }
};

发表于 2022-03-09 08:22:36 回复(0)