题目描述
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
烤乐滋每次见到小姐姐都十分紧张,为了减缓这种紧张感,他决定尽可能找到自己与小姐姐的共同点。这天,烤乐滋凭借自己强大的人格魅力获取了小姐姐的基因片段,同时他也提供了自己的基因片段,现在我们假定,他们的公共点个数为两个片段的最长公共子序列中元素个数,请你来帮帮他吧!
Input
The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.
多组输入,每行有两个字符串,基因片段长度不超过500
Output
For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
每行一个答案,表示每组数据中他们的公共点个数
Sample
Input
abcfbc abfcab
programming contest
abcd mnp
Output
4
2
0
Java代码
经典dp,子序列并非子串,可以不用连续。本来这题我是写了输入输出流,但是一直RE,不知道是不是平台的问题,交了无数次令人奔溃,以下是AC代码。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true){
String a = in.next();
String b = in.next();
char[] aa = a.toCharArray();
char[] bb = b.toCharArray();
int n1 = a.length();
int n2 = b.length();
int[][] dp = new int[n1+1][n2+1];//记录a串第i个字符匹配到b串第j个字符的最长公共子串长度
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
if (aa[i-1] == bb[j-1]) {
dp[i][j] = dp[i-1][j-1] +1;
}else {
dp[i][j] = Math.max(Math.max(dp[i-1][j], dp[i][j-1]),dp[i-1][j-1]);
}
}
}
System.out.println(dp[n1][n2]);
}
}
}