dp 最長公共子串行(LCS)

2022-06-27 09:27:13 字數 1492 閱讀 1153

字串行 與 字元字串的區別

序列是可以不連續的字串 , 字串必須要是連續的 。

問題描述 :

給定兩串字串 abcde 和 acdf , 找出 2 串中相同的字串行,觀察知 相同的字串行為 acd 。

方法一 : 暴力解決

對於乙個長度為 n 的串 , 它的字串總共有 2^n 個,在用著 2^n 個字串與另乙個長度為 m 的串一一比較 ,那麼複雜度為 m * 2^n 。複雜度是指數級別的,顯然會超時。

方法二 : 動態規劃求解

兩個串長度為 n 和 m , 建乙個二維陣列 , 用來記錄狀態 ,並且初始化陣列內容為 0 ,m 和 n 分別從 0 開始 , m++ , n++ 迴圈

產生公共子串行的可能情況 :

兩個序列 s1~sn 和 t1 ~ tm , 當 s i+1 == t i+1 時 , 在s1 ~ si 和 t1 ~ ti 的公共子串行末尾追加 s i+1 。

s1~si 和 t1~ti+1的公共序列。

s1~si+1 和 t1 ~ ti 的公共序列 。

**示例 :

/*

* author: renyi

* created time: 2017/8/31 8:33:36

* file name: 1.cpp

*/#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int maxint = -1u>>1;

#define max(a,b) a>b?a:b

#define min(a,b) a>b?b:a

#define ll long long

int dp[10][10];

int main()

for (int i = len2; i > 0; i--)

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

else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}

// printf("%d\n", dp[len1][len2]); // 公共字串的長度

/* for (int i = len1, j = len2; i > 0 && j > 0; )

else if(dp[i][j-1] >= dp[i-1][j]) j--;

else i--;

}*/ int i = len1 , j = len2;

while (i && j)

else if (dp[i][j-1] >= dp[i-1][j]) j--;

else i--;

}return 0;

}

DP 最長公共子串行 LCS

題目 poj 1458 題目簡述 求兩個字串的最長公共子串行的長度。題目分析 這是一道經典的lcs問題,用dp來解決。include include include define mem x memset x 0,sizeof x define maxn 10 1000 using namespac...

dp 最長公共子串行 LCS

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。兩個字串的...

最長公共子串行(LCS)與最長公共子串 DP

1 最長公共子串行 lcs 與最長公共子串 dp 子串應該比較好理解,至於什麼是子串行,這裡給出乙個例子 有兩個母串 比如序列bo,bg,lg在母串cnblogs與belong中都出現過並且出現順序與母串保持一致,我們將其稱為公共子串行。最長公共子串行 longest common subseque...