問題描述:字串行的子串行是指從給定字串行中隨意地(不一定連續)去掉若干個字元(可能乙個也不去掉)後所形成的字串行。令給定的字串行x=「x0,x1,…,xm-1」,序列y=「y0,y1,…,yk-1」是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j=0,1,…,k-1,有xij=yj。例如,x=「abcbdab」,y=「bcdb」是x的乙個子串行。
解決方法:
1、窮舉法:針對序列x中所有的子串行(共2^m個),在y序列中尋列是否存在相同序列,並找出其中最大的序列。這種方法的時間複雜度為o(2^m*2^n)。
2、動態規劃法:引進乙個二維陣列c,用c[i][j]記錄x[i]與y[j] 的lcs 的長度,b[i][j]記錄c[i][j]是通過哪乙個子問題的值求得的,以決定搜尋的方向。可以通過以下公式來計算從c[i][j]的值。
複雜度分析:
時間複雜度:o(m*n);
空間複雜度:o(m*n);
**:
#include "stdafx.h"
#include #include #define maxlen 100
using namespace std;
void getlcslen(string str1, string str2,int m,int n,int c[maxlen],int b[maxlen])
else
else}}
}}void printlcs(int b[maxlen], string x, int i, int j) //遞迴回溯最長子序列
{ if (i == 0 || j == 0)
return;
if (b[i][j] == 0)
{printlcs(b, x, i - 1, j - 1);
cout<
最長公共子串行問題
給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...
最長公共子串行問題
最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...
最長公共子串行問題
最長公共子串行問題是使用動態規劃的典型應用 解決此問題需要定義二維輔助陣列 dp m 1 n 1 其基本公式 最後通過回溯,找到其公共子串行 回溯方法如下 此圖摘自 例項程式如下 include include include includeusing namespace std int max i...