1. 思路-动态规划
典型的最长公共子串问题,可参考leetcode1143. 最长公共子序列,官方有详细解析,对动态规划还不了解的可以先学习动态规划的知识,去leetcode刷些相关题再看本题。
思路:
1. dp[i][j],表示蛋蓝质1前i个蓝肽子和蛋蓝质2前j个蓝肽子最长子序列为dp[i][j]个。
2. 当i=0或j=0时,dp[i][j]==0;
3. 转换公式:
str1(蛋蓝质1),str2(蛋蓝质2);
str1[i]==str2[j]时,dp[i][j]==dp[i-1][j-1]+1;
str1[i]==str2[j]时,dp[i][j]==Math.max(dp[i-1][j],dp[i][j-1]);
2. code
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class 蓝肽子序列_动态规划 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String a=sc.next();
String b=sc.next();
sc.close();
List<String> l1=new ArrayList<>();
List<String> l2=new ArrayList<>();
StringBuilder sb=new StringBuilder();
//字符串转换为容器,方便操作
for (int i = 0; i < a.length();) {
sb.setLength(0);
sb.append(a.charAt(i++));
while(i<a.length()&&a.charAt(i)>90) {
sb.append(a.charAt(i++));
}
l1.add(sb.toString());
}
for (int i = 0; i < b.length();) {
sb.setLength(0);
sb.append(b.charAt(i++));
while(i<b.length()&&b.charAt(i)>90) {
sb.append(b.charAt(i++));
}
l2.add(sb.toString());
}
//动态规划解题
int[][] dp=new int[l1.size()+1][l2.size()+1];
for (int i = 1; i <= l1.size(); i++) {
String c1=l1.get(i-1);
for (int j = 1; j <= l2.size(); j++) {
if(c1.equals(l2.get(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[l1.size()][l2.size()]);
}
}
Input:
LanQiaoBei
LanTaiXiaoQiao
Output:
2