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

相关内容

热门资讯

轻松掌握.麻友圈究竟怎么开挂[... 亲,麻友圈这个游戏其实有挂的,确实是有挂的,需要了解加客服微信【4579337】很多玩家在这款游戏中...
实测分享“随意玩拼三张究竟有没... 您好:随意玩拼三张这款游戏可以开挂,确实是有挂的,需要软件加微信【5902455】,很多玩家在随意玩...
科普实测“新518互游牛牛透视... 您好:新518互游牛牛这款游戏可以开挂,确实是有挂的,需要软件加微信【69174242】,很多玩家在...
普及一下“众悦到底有智能挂吗”... 您好:众悦可以开挂,确实是有挂的,咨询加微6378730很多玩家在众悦中打牌都会发现很多用户的牌特别...
分享实测“新超圣大厅是不是有挂... 您好:新超圣大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【69174242】很多玩家在新超...