LCS最长公共子序列与最长公共子串

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);
    }  
   
}  


猜你喜欢

转载自blog.csdn.net/ustcyy91/article/details/80734440