【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)
學習交流加
- 個人qq:
1126137994 - 個人微信:
liu1126137994 - 學習交流資源分享qq群:
962535112
給定兩個字符串A和B,返回兩個字符串的最長公共子序列的長度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”123456"或者"12C4B6"都是最長公共子序列。
給定兩個字符串A和B,同時給定兩個串的長度n和m,請返回最長公共子序列的長度。保證兩串長度均小于等于300。
測試樣例:
“1A2C3D4B56”,10,“B1D23CA45B6A”,12
返回:6
這是一個最長公共子序列問題,不是最長上升子序列問題,注意區分!!!!!!!
我們同樣是使用動態規劃的思想,假設字符串A的長度為n,字符串B的長度為m,則我們生成一個dp矩陣,大小為n*m。
那么dp[i][j]含義,就為A[0i]與B[0j]的最長公共子序列!!!
那么dp[i][j]的求法是什么?
1、矩陣dp的第一行dp[0][i]:
代表A[0]與B[0i]的最長公共子序列長度,A[0]只有一個字符,所以dp[0][i]最大值為1,如果A[0]==B[i],則另dp[0][i]=1;一旦dp[0][i]=1,則將dp[0][(i+1)(m-1)]全部設為1;
2、矩陣的第一列dp[j][0]
求法與求第一行的值相同,如果B[0]==A[j],則另dp[j][0]=1;一旦dp[j][0]=1,則將dp[(j+1)~(n-1)][0]全部設為1;
3、矩陣其他行的值的求法
dp[i][j]的情況,只可能來自以下兩種情況:
情況一:A[i] 與 B[j]不相等
dp[i][j]可能是等于dp[i-1][j]的值
同理,也有可能是等于dp[i][j-1]
然后選擇上述兩者的最大值即可!!!
情況二:A[i] 與 B[j]相等
此時,dp[i][j]=dp[i-1][j-1]+1
代碼實現如下:
class LCS { public:int findLCS(string A, int n, string B, int m) {// write code here// if(n==0||m==0)// return 0;int dp[n][m];//先求第一行int flag1,flag2;for(int h=0;h<=m-1;h++){if(A[0]!=B[h])dp[0][h]=0;else{flag1=h;for(int k=flag1;k<=m-1;k++){dp[0][k]=1;}break;} }//再求第一列for(int q=0;q<=n-1;q++){if(B[0]!=A[q])dp[q][0]=0;else{flag2 =q;for(int p=flag2;p<=n-1;p++){dp[p][0]=1;}break;} }//再求其他行的值for(int i=1;i<=n-1;i++){for(int j=1;j<=m-1;j++){if(A[i]==B[j])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}return dp[n-1][m-1];} };求最優解問題,往往能夠使用動態規劃的方法來做,動態規劃,就是先求解子問題,然后整合求解整體問題!算法的思想,還是很奇妙的!!!
總結
以上是生活随笔為你收集整理的【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt6.4安装教程
- 下一篇: 从零开始学android编程_andro