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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LCS最长公共子序列

發布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LCS最长公共子序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

例如 b c d d e和 a c e e d e的公共子串為c d e。
如果使用暴力,復雜度太高會直接超時。就需要使用動態規劃

  • dp[i][j]表示a串第i個結尾,b串第j個結尾的最長公共子串的數量。
  • 首先分析i,j的情況
  • 如果a[i]==b[j],因為兩個元素都在最末尾的位置。所以一定可以匹配成功。換句話說,這個位置的鄰居不可能大于他(最多相等).所以這個時候就是dp[i][j]=dp[i-1][j-1] +1;像例子就是類似 求dp(b c d d和a c e e d e)兩個末尾加上e,所以結果就出來了。
  • 如果a[i]!=b[j],這樣考慮的角度有兩個,這樣就要考慮繼承的關系,當然要考慮繼承大的,你不知道a串的最后一個和b串倒數第二個的dp大還是a串的倒數第二個和b串的最后一個那個大,(也可能相等)比如 a b c和e c q這兩個串肯定選擇繼承(a,b,c)和(e,c)串的dp值而不會選擇繼承(a,b)和(e,c,q)的dp值。
  • 這樣代碼就好些了,附上Java代碼(數組申請大以為從1開始操作)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer;public class testD {public static void main(String[] args) throws IOException {// TODO 自動生成的方法存根StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));while(in.nextToken()!=StreamTokenizer.TT_EOF){String s1=in.sval;in.nextToken();String s2=in.sval;char a1[]=s1.toCharArray();char a2[]=s2.toCharArray(); // int index1=0;int index2=0;int dp[][]=new int[s1.length()+1][s2.length()+1];for(int i=1;i<s1.length()+1;i++){for(int j=1;j<s2.length()+1;j++){if(a1[i-1]==a2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}elsedp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}out.println(dp[a1.length][a2.length]);out.flush(); }}private static int max(int i, int j) {// TODO 自動生成的方法存根return i>j?i:j;} } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

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

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