LCS問題變型,要求子串行必須連續

2021-06-04 08:06:21 字數 1159 閱讀 4134

問題和lcs相似,但是要求最長的字串必須連續。

同樣可以採取動態規劃方法,分別使用兩個陣列來儲存中間計算結果:

1)乙個儲存當到達位置i,j時,最大的字串長度;

2)另一儲存以i,j為截止的位置的連續字串的長度;

每次如果a[i] == b[j]時,比較max_length[i-1][j-1]和length_endinghere[i][j]來進行決策,具體見程式

如果a[i] != b[j]時,類似於lcs問題。

值得注意的一點是,需要乙個max來儲存取得最大長度時,i,j的位置,開始沒有通過max來篩選,出現了錯誤。

具體**如下:

#include #include std::string longestcommonadjsubsequence(const std::string& string_a, const std::string& string_b) 

} int max_length_found = -1;

int max_end_i = -1;

int max_end_j = -1;

for (int i = 1; i <= a_size; ++i)

} else

} else else

length_endinghere[i][j] = 0;}}

} for(int i = 0; i <= a_size; ++i)

printf("\n");

} printf("\n");

for(int i = 0; i <= a_size; ++i)

printf("\n");

} printf("%d %d\n", max_end_i, max_end_j);

for (int i = 0; i <= a_size; ++i)

delete length_endinghere;

delete max_length;

std::string ret = "";

if (max_end_i != -1) while(string_a[++max_end_i] == string_b[++max_end_j]);

} return ret;

}int main(int argc, char** argv)

最長公共子串行(LCS)問題

問題描述 見演算法導論p208 p209 前提概念 給定乙個序列x x1,x2,xm 對i 0,1,m,記x的第i個字首為xi x1,x2,xi 故xm x,而x0是個空序列 乙個給定序列的子串行就是該序列去掉0個或多個元素 不一定連續 如bcdb是abcbdab的乙個子串行 基於以上定義,最長公共...

最長公共子串行問題LCS

乙個給定序列的子串行是指在原序列順序不變的基礎上刪去若干元素後得到的序列。給定兩個序列x和y,當乙個序列z既是x的子串行又是y的子串行時,稱z序列為x和y 的公共子串行。例如,x a,b,c,b,d,a,b y b,d,c,a,b,a 則序列 b,c,a 是x和y的乙個公共子串行,但不是x和y的最長...

最長公共子串行 LCS 問題

前言 學習過的知識,只要不經常使用就會忘記,所以在此寫部落格,記錄下來,方便自己,也可能有利於他人。最長公共子串行 lcs 問題。1.什麼是最長公共子串行?最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別是兩個或多個已知序列的子...