【蓝桥云课】最长公共子序列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()]);}}
}

相关内容

热门资讯

重大通报“桓仁麻将 真的能开挂... 您好:桓仁麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【3716361】很多玩家在这款游戏...
【重大通报】“卡农大厅可以开挂... 卡农大厅这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【3847338】或【9532529】...
重大通报“哈灵麻将是不是有挂吗... 您好:哈灵麻将这款游戏可以开挂,确实是有挂的,需要软件加微信【69174242】,很多玩家在哈灵麻将...
〖实测分享〗“白金岛跑得快有挂... 您好:这款游戏白金岛跑得快可以开挂的,确实是有挂的,通过加微【7482525】咨询,很多玩家在这款游...
玩家必备技术“丽水跑得快有开挂... 无需打开直接搜索微信【3847338】或【9532529】, 操作使用教程;您好;丽水跑得快这款游戏...