我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。
例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。
现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度。
输入包含多组数据。
每组数据包含两个字符串m和n,它们仅包含字母,并且长度不超过1024。
对应每组输入,输出最长公共子序列的长度。
abcfbc abfcab programming contest abcd mnp
4 2 0
import java.util.*; public class Main{ public static int LCS(String m,String n){ int lenm = m.length(); int lenn = n.length(); int[][] dp = new int[lenm+1][lenn+1]; for(int i = 1;i <= lenm;i++){ for(int j = 1;j <= lenn;j++){ if(m.charAt(i - 1) == n.charAt(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]); } } } return dp[lenm][lenn]; } public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String m = sc.next(); String n = sc.next(); int res = LCS(m,n); System.out.println(res); } } }
//注意类名必须是Main,才能进行调试 //使用res矩阵,存储子问题的结果。 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ String[] str = in.nextLine().split(" "); int resLen = longestCommonSubsequence1(str[0], str[1]); System.out.println( resLen ); } } private static int longestCommonSubsequence1(String s1, String s2) { int m = s1.length(); int n = s2.length(); if(m==0||n==0) return 0; //存储子问题的结果。 //行和列的索引表示:取字符串从左到中间的子串的长度 //索引范围:[0-m]和[0-n] int[][] res = new int[m+1][n+1]; //逐行添加子问题的结果。 第一行和第一列值未初始化值,系统默认为0 //i或j表示取字符串从左到中间的子串的长度 for(int i=0; i<=m; i++){ for(int j=0; j<=n; j++){ if(i==0||j==0) res[i][j] = 0; else if(s1.charAt(i-1)==s2.charAt(j-1)) //i而j表示的是子串长度,所以这里要减1 res[i][j] = res[i-1][j-1] + 1; else{ res[i][j] = Math.max(res[i-1][j], res[i][j-1]); } } } return res[m][n]; } }