最长公共子序列
题目来源:最长公共子序列
题目描述:
给定两个字符串,寻找这两个字串之间的最长公共子序列。
输入:
输入两行,分别包含一个字符串,仅含有小写字母。
输出:
最长公共子序列的长度。
问题分析:
(1)最长公共子序列并非最长字串,例如:这两个字符串的最长公共子序列就是"ab"或"ac",即同一方向,两个字符串中相同字母按相同顺序所构成的序列。
(2)既然首先要找出相同的元素就要挨个比较,又要计算出最大公共子序列的长度,可以采用动态规划算法。
(3)将两个字符串(s1,s2)转化为字符数组,定义一个二维数组用来存储不同情况,最大公共子序列的长度,列表:可发现规律:
1.当遇到两个字符相等时。最大公共子序列的长度=去掉这个两个字符后最后公共子序列长度+1
2.如果两个字符不相等,则分别对比去掉一个字符,后最大公共子序列的长度,当先最大公共子序列的长度等于较大值。
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s1 = scanner.next();
String s2 = scanner.next();
int [] [] dp=new int[s2.length()+1][s1.length()+1];
for (int i =0;i< dp.length;i++){
for (int j=0;j<dp[i].length;j++){
if (i==0||j==0){
dp[i][j]=0;
continue;
}
if (s1.charAt(j-1)==s2.charAt(i-1)){
dp[i][j]=dp[i-1][j-1]+1;
}else {
if (dp[i-1][j]>dp[i][j-1]){
dp[i][j]=dp[i-1][j];
}else {
dp[i][j]=dp[i][j-1];
}
}
}
}
System.out.println(dp[s2.length()][s1.length()]);
}
}
}