字串行 與 字元字串的區別
序列是可以不連續的字串 , 字串必須要是連續的 。
問題描述 :
給定兩串字串 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...