动态规划--最长公共子串
生活随笔
收集整理的這篇文章主要介紹了
动态规划--最长公共子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
找兩個字符串的最長公共子串,這個子串要求在原字符串中是連續的。其實這又是一個序貫決策問題,可以用動態規劃來求解。我們采用一個二維矩陣來記錄中間的結果。這個二維矩陣怎么構造呢?"bab"和"caba"(當然我們現在一眼就可以看出來最長公共子串是"ba"或"ab")
b a b
c 0 0 0
a 0 1 0
b 1 0 1
a 0 1 0
我們看矩陣的斜對角線最長的那個就能找出最長公共子串。
不過在二維矩陣上找最長的由1組成的斜對角線也是件麻煩費時的事,下面改進:當要在矩陣是填1時讓它等于其左上角元素加1。
b a b
c 0 0 0
a 0 1 0
b 1 0 2
a 0 2 0
b a b
c 0 0 0
a 0 1 0
b 1 0 1
a 0 1 0
我們看矩陣的斜對角線最長的那個就能找出最長公共子串。
不過在二維矩陣上找最長的由1組成的斜對角線也是件麻煩費時的事,下面改進:當要在矩陣是填1時讓它等于其左上角元素加1。
b a b
c 0 0 0
a 0 1 0
b 1 0 2
a 0 2 0
這樣矩陣中的最大元素就是 最長公共子串的長度。
import java.util.Scanner;public class LCS {public static void main(String[] args) {Scanner in=new Scanner(System.in);String s1=in.nextLine();String s2=in.nextLine();System.out.println(iQueryMaxCommString(s1,s2));}public static String iQueryMaxCommString(String stringA, String stringB){/* 在這里實現功能,將結果填入輸入數組中*/ //String x = "wer";//String y = "werasdfaswer";String x=stringA;String y=stringB;// 設置字符串長度int substringLength1 = x.length();int substringLength2 = y.length(); // 具體大小可自行設置// 構造二維數組記錄子問題x[i]和y[i]的LCS的長度int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];// 動態規劃計算所有子問題。也可從前到后。for (int i =0; i <substringLength1; i++) {for (int j = 0; j <substringLength2 ; j++) {if (x.charAt(i) == y.charAt(j))if(i==0||j==0){opt[i][j]=1;}else{opt[i][j] = opt[i -1][j - 1] + 1;//左上角加1} }}/*System.out.println("substring1:" + x);System.out.println("substring2:" + y);System.out.println("LCS:");//輸出狀態矩陣for (int i =0; i <substringLength1; i++) {for (int j = 0; j <substringLength2 ; j++) { System.out.print(opt[i][j]+" "); }System.out.println();}*///找到狀態舉矩陣的最大值,和坐標indexi,indexj int max=opt[0][0];int indexi=0,indexj=0;for (int i =0; i <substringLength1; i++) {for (int j = 0; j <substringLength2 ; j++) { if(opt[i][j] >max){max=opt[i][j]; indexi=i;indexj=j;}} }//System.out.println(max);if(max!=0){ //取短的字符串輸出String rs=null;int indexofmax=0,shortlen;if(substringLength1>substringLength2){shortlen=substringLength2;rs=y;indexofmax=indexj;}else{shortlen=substringLength1;rs=x;indexofmax=indexi;}StringBuffer sb=new StringBuffer();for(int i=0;i<max;i++){sb.append(rs.charAt(indexofmax-max+1+i)); }return sb.toString();}return null;} }
總結
以上是生活随笔為你收集整理的动态规划--最长公共子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划--连续子序列的最大和
- 下一篇: 报数字游戏