日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划--最长公共子串

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划--最长公共子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
兩個字符串的最長公共子串,這個子串要求在原字符串中是連續的。其實這又是一個序貫決策問題,可以用動態規劃來求解。我們采用一個二維矩陣來記錄中間的結果。這個二維矩陣怎么構造呢?"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

這樣矩陣中的最大元素就是 最長公共子串的長度。

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

總結

以上是生活随笔為你收集整理的动态规划--最长公共子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。