原题:
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
StringBuffer sb = new StringBuffer();
// 存储蓝肽,下面的循环也是同样的作用
for (int i = 0; i < str1.length(); ) {
sb.setLength(0);
sb.append(str1.charAt(i++));
// 判断首字母后面的小写字母,Z的ASCII码为90
while (i < str1.length() && str1.charAt(i) > 90) {
sb.append(str1.charAt(i++));
}
list1.add(sb.toString());
}
for(int i = 0; i < str2.length();) {
sb.setLength(0);
sb.append(str2.charAt(i++));
while(i < str2.length() && str2.charAt(i) > 90) {
sb.append(str2.charAt(i++));
}
list2.add(sb.toString());
}
int[][] dp = new int[list1.size() + 1][list2.size() + 1];
for(int i = 1; i <= list1.size(); i++) {
String temp = list1.get(i - 1);
for(int j = 1; j <= list2.size(); j++) {
// 如果有相同的蓝肽,即子序列,就+1
if(temp.equals(list2.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[list1.size()][list2.size()]);
}
}
最近看了一下动态规划,大概有些苗头,但不是特别会,希望大家能指正一下,非常感谢