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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最长公共子序列问题 (LCS)

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

最長公共子序列問題 : ?

1>給兩個子序列A和B,求長度最大的公共子序列。例如1,5,2,6,8,7和2,3,5,6,9,8,4的最長公共子序列為5,6,8(另一個解是2,6,8)。

2>我們稱序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列當且僅當存在嚴格上升的序列< i1, i2, ..., ik >,使得對j = 1, 2, ... ,k, 有xij = zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。

現在給出兩個序列X和Y,你的任務是找到X和Y的最大公共子序列,也就是說要找到一個最長的序列Z,使得Z既是X的子序列也是Y的子序列。

舉個例子:cnblogs這個字符串中子序列有多少個呢?很顯然有27個,比如其中的cb,cgs等等都是其子序列,我們可以看出

子序列不見得一定是連續的,連續的那是子串。

? ? ?我想大家已經了解了子序列的概念,那現在可以延伸到兩個字符串了,那么大家能夠看出:cnblogs和belong的公共子序列嗎?

在你找出的公共子序列中,你能找出最長的公共子序列嗎?


從圖中我們看到了最長公共子序列為blog,仔細想想我們可以發現其實最長公共子序列的個數不是唯一的,可能會有兩個以上,

但是長度一定是唯一的,比如這里的最長公共子序列的長度為4。


思路如下面的圖:




方案:既然是經典的題目肯定是有優化空間的,并且解題方式是有固定流程的,這里我們采用的是矩陣實現,也就是二維數組。

第一步:先計算最長公共子序列的長度。

第二步:根據長度,然后通過回溯求出最長公共子序列。

現有兩個序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi},

設一個C[i,j]: 保存Xi與Yj的LCS的長度。

動態規劃的一個重要性質特點就是解決“子問題重疊”的場景,可以有效的避免重復計算,根據上面的

公式其實可以發現C[i,j]一直保存著當前(Xi,Yi)的最大子序列長度。

如下代碼:


#include<stdio.h> #include<string.h> #include<iostream> using namespace std;int smax(int x,int y){return x >=y ? x : y; }int maxstr[10000][10000]; char str1[1000],str2[1000];int main(){int len1,len2;while(scanf("%s%s",&str1, &str2)!=EOF){len1=strlen(str1);len2=strlen(str2);for(int i=0; i<=len1; ++i){maxstr[i][0]=0;//初始化邊界,過濾掉0的情況}for(int i=0; i<=len2; ++i){maxstr[0][i]=0;}//填充矩陣for(int i=1; i<=len1; ++i){for(int j=1; j<=len2; ++j){if(str1[i-1]==str2[j-1])//相等的情況maxstr[i][j]=maxstr[i-1][j-1]+1;else if(maxstr[i-1][j] >= maxstr[i][j-1]){//比較“左邊”和“上邊“,根據其max來填充maxstr[i][j]=maxstr[i-1][j];}else{maxstr[i][j]=maxstr[i][j-1];}}}printf("%d\n",maxstr[len1][len2]);}return 0; }


參考博客:http://www.cnblogs.com/huangxincheng/archive/2012/11/11/2764625.html

參考博客:http://blog.csdn.net/chenwenshi/article/details/6027884


總結

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

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