【蓝桥云课】最长公共子序列LCS
创始人
2025-05-30 11:30:05

题目描述:输入两个字符串st,求它们的最长公共子序列(不连续)。

样例输入:

BDCABA
ABCBDAB

样例输出:

4
解释:s和t的最长公共子序列为BDAB、BCAB、BCBA,长度为4

方法:
定义dp[i][j]dp[i][j]dp[i][j]表示s1,s2,s3,....,sis_{1},s_{2},s_{3},....,s_{i}s1​,s2​,s3​,....,si​与t1,t2,t3,....,tjt_{1},t_{2},t_{3},....,t_{j}t1​,t2​,t3​,....,tj​的最长公共子序列;

那么
dp[i+1][j+1]={dp[i][j]+1,如果si+1=tj+1max(dp[i][j+1],dp[i+1][j]),如果si+1≠tj+1dp[i+1][j+1]=\begin{cases} dp[i][j]+1& \text{,如果$s_{i+1}=t_{j+1}$}\\ max(dp[i][j+1],dp[i+1][j])& \text{,如果$s_{i+1}≠t_{j+1}$} \end{cases}dp[i+1][j+1]={dp[i][j]+1max(dp[i][j+1],dp[i+1][j])​,如果si+1​=tj+1​,如果si+1​=tj+1​​

程序代码:

import java.util.Arrays;
import java.util.Scanner;public class LCS {public static void main(String[] args) {String s="",t="";Scanner sc = new Scanner(System.in);while(sc.hasNext()) {s=sc.next();t=sc.next();int[][] dp = new int[s.length()+1][t.length()+1];for(int i=0;ifor(int j=0;jif(s.charAt(i)==t.charAt(j)) {dp[i+1][j+1]=dp[i][j]+1;} else {dp[i+1][j+1]=Math.max(dp[i][j+1], dp[i+1][j]);}}}System.out.println(dp[s.length()][t.length()]);}}
}

相关内容

热门资讯

『2025王昕年度演讲·洞见昕... 2025年12月18日19:08-22:08,由知名招商专家、大商之道招商产业集团联合创始人、全网1...
吴泳铭:重估阿里的“关键先生”... 他的每一步思考和判断,都将影响阿里未来的竞争站位。文|《中国企业家》记者 邓双琳编辑|马吉英头图来源...
美女负责人受贿逾540万,中信... 据财新报道,因在公司债“19路劲01”发行过程中私下收取返费,中信建投(601066.SH)原债承部...
李嘉诚港口交易再反转,中方要求... 李嘉诚港口交易再反转,中方明确表态,中国企业必须要拿下控股权!否则,贝莱德就别想买下这43个港口了,...
轻松健康港交所挂牌,打造“AI... 12月23日,中国领先的数字健康服务平台——轻松健康集团(股票代码:2661.HK)正式在香港联合交...