每日OJ题_牛客_最长公共子序列_DP_C++_Java

目录

牛客_最长公共子序列_DP

题目解析

C++代码

Java代码


牛客_最长公共子序列_DP

最长公共子序列(一)_牛客题霸_牛客网

描述:

给定两个字符串 s1 和 s2,长度为 n 和 m 。求两个字符串最长公共子序列的长度。

所谓子序列,指一个字符串删掉部分字符(也可以不删)形成的字符串。例如:字符串 "arcaea" 的子序列有 "ara" 、 "rcaa" 等。但 "car" 、 "aaae" 则不是它的子序列。

所谓 s1 和 s2 的最长公共子序列,即一个最长的字符串,它既是 s1 的子序列,也是 s2 的子序列。

数据范围 : 1≤m,n≤1000。保证字符串中的字符只有小写字母。

要求:空间复杂度 O(mn),时间复杂度 O(mn)

进阶:空间复杂度 O(min(m,n)),时间复杂度 O(mn)

输入描述:

第一行输入一个整数 n 和 m ,表示字符串 s1 和 s2 的长度。

接下来第二行和第三行分别输入一个字符串 s1 和 s2。

输出描述:

输出两个字符串的最长公共子序列的长度


题目解析

子序列即两个字符串中公共的字符,但不一定连续。

从题干中可以提取出问题:求字符串s和t的最长公共子序列 假设LCS(m,n)为长度为m的字符串s与长度为n的字符串t的最长公共子序列,直接进行求解时不太 好求解,那么可以将问题简化为其子问题,假设s和t的长度为任意值i和j,即求LCS(i,j):

C++代码

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int n = 0, m = 0;
	string str1, str2;
	cin >> n >> m >> str1 >> str2;;
	vector<vector<int>> dp(n + 1, vector<int>(m + 1));
	str1 = " " + str1, str2 = " " + str2;
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j)
		{
			if (str1[i] == str2[j])
			{
				// dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
				dp[i][j] = dp[i - 1][j - 1] + 1;
			}
			else
			{
				dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
			}
		}
	}
	cout << dp[n][m];
	return 0;
}

Java代码

cpp 复制代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), m = in.nextInt();
        char[] s1 = in.next().toCharArray();
        char[] s2 = in.next().toCharArray();
        int[][] dp = new int[n + 1][m + 1];
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                if(s1[i - 1] == s2[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]); 
            }
        }
        System.out.println(dp[n][m]);
    }
}
相关推荐
沐知全栈开发3 分钟前
备忘录模式(Memento Pattern)
开发语言
wuqingshun3141598 分钟前
大致说一下程序、进程、线程
java·运维·服务器·开发语言
Loo国昌10 分钟前
【AI应用开发实战】00_StockPilotX技术博客专栏:从零构建生产级AI金融分析系统
人工智能·算法·语言模型·自然语言处理·金融·prompt
wuqingshun31415911 分钟前
Object有哪些方法,大致说一下每个方法的含义?
java·开发语言·jvm
NGC_661112 分钟前
Dijkstra算法
算法
Coder_Boy_12 分钟前
Java高级_资深_架构岗 核心知识点(模块三:高并发)
java·spring boot·分布式·面试·架构
Tisfy13 分钟前
LeetCode 762.二进制表示中质数个计算置位:位运算(mask O(1)判断)
算法·leetcode·题解·位运算·质数
你撅嘴真丑14 分钟前
第十章-数论初步
算法
Coder_Boy_22 分钟前
Java高级_资深_架构岗 核心知识点全解析(模块二:Spring生态 架构岗必备)
java·spring boot·spring·架构
你的冰西瓜22 分钟前
C++ STL算法——数值算法
开发语言·c++·算法·stl