最長公共子串行,英文縮寫為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...