1. 程式人生 > >最長公共子串(Longest Common SubStrings)

最長公共子串(Longest Common SubStrings)

Description

給出兩個字串,求出兩個字串的公共子串?

sample Input

encodingmy
mydecoding

sample Output

coding

兩種方法:

//暴力求解最長公共子串
    public static void enumString(char[]s1 ,char[]s2){
        int run_Count = 0;//執行次數
        int common_length = 0;//長度
        String largest_str = "";
        for(int i=0;i<s1.length;i++){
            for
(int j=0;j<s2.length;j++){ int length = 0; int m = i; int n = j; String tem_str = "";//臨時子串 while(m<s1.length && n < s2.length){ run_Count ++; if(s1[m] != s2[n]) break
; tem_str = tem_str + s1[m]; length++; m++; n++; } if(common_length < length){ common_length = length; } if(tem_str.length()>=largest_str.length()){ largest_str = tem_str; } } } System.out
.println("最長公共子串數:"+common_length); System.out.println("最長公共子串:"+largest_str); System.out.println("執行次數:"+run_Count); }
//動態規劃方法
    public static void dpString(char[]s1 ,char[]s2){
        int[][] dp = new int[101][101];
        int max = -1;
        //初始化陣列
        for(int i=0;i<dp.length;i++){
            dp[0][i] = 1;
            dp[i][0] = 1;
        }
        int x = 0;
        int y = 0;
        for(int i=1;i<s1.length;i++){
            for(int j=1;j<s2.length;j++){
                if(s1[i] == s2[j]){
                    //動態轉移方程
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = 0;
                }
                if(max < dp[i][j]){
                    max = dp[i][j];
                    x = i;
                    y = j;
                }
            }
        }
        //輸出子串
        System.out.print("最長子串:");
        for(int i=0,k=max;k>0;k--,i++){
            System.out.print(s1[x-max+1+i]);
        }
        //輸出子串長度
        System.out.println("\n最長子串長度:"+max);
    }
import java.util.Scanner;

public class Main { 
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        //字串資料讀取
        String str1 = in.nextLine();
        String str2 = in.nextLine();
//      str1 = str1.replace(" ", "");
//      str2 = str2.replace(" ", "");
//      System.out.println(str1);  
//      System.out.println(str2);
        char[]s1 = str1.toCharArray();
        char[]s2 = str2.toCharArray();
//      enumString(s1,s2);
        dpString(s1,s2);
    }

結果
這裡寫圖片描述