1、什麼是最長公共子序列ios
例:設有兩個字符串str1="nyiihaoo" , str2="niyeyiyang",那麼"nyiihaoo"中的子序列:"ny" 長度是2; "niyeyiyang"中的子序列:"ny"長度也爲2,這是str1與str2的一個公共子序列,長度爲2。那麼這兩個字符串最長的公共子序列應該是什麼呢? 顯然是 "nyi ih a oo"(或 "ny i i h a oo") 中"nyia" 以及 "n i y ey i y a ng"(或" n iye yi y a ng ")中的"nyia" : 其"nyia"長度是4,在str1和str2中咱們找不到長度大於4的最長公共子序列了。因此str1和str2的最長公共子序列的長度是4。c++
2、動態規劃(dynamic programing)解決最長公共子序列長度問題數組
咱們首先定義一個二維數組 dp[i][j] 其含義是:str1中前 i-1 個字符 與 str2中前j-1個字符中最長公共子序列的長度。 yii
這時咱們要找出其動態轉移方程,分析 ( 要結合數組的意義理解 ) :
spa
當 str1[i-1]==str2[j-1] , dp[i][j] = dp[i-1][ j-1]+1 ;code
不然:d[i][j] = max{ dp[i-1][ j ] ,dp[ i ][ j-1 ] };blog
3、代碼實現(c++)ci
#include<iostream> #include<cstring> #include<string> using namespace std; int a[2000][2000]; int main(){ string str1,str2; while(cin>>str1>>str2){ memset(a,0,sizeof(a)); int i=0,j=0; for(int i=1;i<=str1.length();i++){ for(int j=1;j<=str2.length();j++){ if(str1[i-1]==str2[j-1]){ a[i][j]=a[i-1][j-1]+1; } else{ a[i][j]=max(a[i-1][j],a[i][j-1]); } } } cout<<a[str1.length()][str2.length()]<<endl; } }