import java.util.ArrayList; import java.util.List; public class Solution { public static void main(String[] args) { System.out.println(longestSub("abcde","aebacec")); System.out.println(longestConsectiveString("abcdefgad","abacsddefsad")); } public static int longestSub(String s1,String s2){ if(s1==null||s2==null||s1.length()==0||s2.length()==0) return 0; int m=s1.length(); int n=s2.length(); int[][] dp=new int[m+1][n+1]; dp[0][0]=0; for(int i=0;i<=m;i++) dp[i][0]=0; for(int i=0;i<=n;i++) dp[0][i]=0; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(s1.charAt(i-1)!=s2.charAt(j-1)) dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]); else dp[i][j]=Math.max(dp[i][j], dp[i-1][j-1]+1); } } return dp[m][n]; } public static String longestConsectiveString(String s1,String s2){ List<Character> list=new ArrayList<Character>(); if(s1==null||s2==null||s1.length()==0||s2.length()==0) return ""; int m=s1.length(); int n=s2.length(); int[][] dp=new int[m+1][n+1]; dp[0][0]=0; for(int i=0;i<=m;i++) dp[i][0]=0; for(int i=0;i<=n;i++) dp[0][i]=0; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(s1.charAt(i-1)!=s2.charAt(j-1)) dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]); else dp[i][j]=Math.max(dp[i][j], dp[i-1][j-1]+1); } } int index=dp[m][n]; char[] ch=new char[index]; while(index>0) { if(dp[m][n]>dp[m-1][n]&&dp[m][n]>dp[m][n-1]) { ch[index-1]=s1.charAt(m-1); m--; n--; index--; } else if(dp[m][n]==dp[m][n-1]) { n--; } else m--; } return new String(ch); } }
LCS状态转移方程:
- 如果s1[m] == s2[n],则dp[m,n] = dp[m - 1, n -1] + 1;
- 如果s1[m] != s2[n],则dp[m,n] = max{dp[m,n - 1],dp[m - 1, n]}
最长连续公共子串的状态转移方程:
s1[i]==s2[j],dp[i][j] = dp[i-1][j-1]+1;
s1[i]!=s2[j].dp[i][j] = 0;
import java.util.ArrayList; import java.util.List; public class Solution { public static void main(String[] args) { System.out.println(longestSubStr("ab","cbab")); //System.out.println(longestConsectiveString("abcdefgad","abacsddefsad")); } public static String longestSubStr(String s1,String s2){ if(s1==null||s2==null||s1.length()==0||s2.length()==0) return ""; int m=s1.length(); int n=s2.length(); int[][] dp=new int[m][n]; for(int i=0;i<m;i++) { if(s1.charAt(i)==s2.charAt(0)) dp[i][0]=1; else dp[i][0]=0; } for(int i=0;i<n;i++) { if(s1.charAt(0)==s2.charAt(i)) dp[0][i]=1; else dp[0][i]=0; } for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { if(s1.charAt(i)==s2.charAt(j)) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=0; } } int max=0; int x = 0,y=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) { if(max<dp[i][j]) { max=dp[i][j]; x=i; y=j; } } return s1.substring(x-max+1,x+1); } }