最長公共子串行

2021-07-16 01:57:28 字數 937 閱讀 2135

最長公共子串行,英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。而最長公共子串(要求連續)和最長公共子串行是不同的。

動態規劃的乙個計算兩個序列的最長公共子串行的方法如下:

以兩個序列 x、y 為例子:

設有二維陣列f[i,j] 表示 x 的 i 位和 y 的 j 位之前的最長公共子串行的長度,則有:

f[1][1] = same(1,1);

f[i,j] = max

其中,same(a,b)當 x 的第 a 位與 y 的第 b 位相同時為「1」,否則為「0」。

此時,二維陣列中最大的數便是 x 和 y 的最長公共子串行的長度,依據該陣列回溯,便可找出最長公共子串行。

該演算法的空間、時間複雜度均為o(n^2)

面試題目如下:

刪除最少字元 使字串成為回文串。

給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。

對於這題來說,插入字元和刪除字元使其成為回文串,答案是一樣的.

首先求s的反串rs,然後對s和rs求最長公共子串行,要刪除的字元個數就是lcs.

時間複雜度: o(n^2)

#include 

using

namespace

std;

const

int maxn=1010;

int dp[maxn][maxn];

class solution

int getlcs(string &s1)

}return dp[len][len];

}};int main()

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...