(11)最長公共子串行

2021-06-14 11:35:35 字數 3036 閱讀 5038

#include using namespace std;

void testlongestcommenstring();

/* 1 3 4 5 5 ,and 2 4 5 5 7 6

最長公共子串行是:4 5 5

動態規劃問題

*//*

c[i][j] = c[i-1][j-1] + 1 (a[i] == b[j])

= max a[i] != b[j]

*//*

1.根據轉移方程,遞迴求解

2.帶記憶的遞迴求解

3.自底向上的動態規劃求解

c[m,n] :長度

b[m,n] :記錄公共字元

*/const int len = 6;

// 動態規劃解決問題

void longestcommonstring(const char *a, unsigned len1, const char *b, unsigned len2, int ** &lenmetrix, char ** &cmetrix);

// 從後往前算

void longestcommonstring_2(const char *a, unsigned len1, const char *b, unsigned len2, int lenmetrix[len + 1], char cmetrix[len + 1]);

// 從前往後

void longestcommonstring_3(const char *a, unsigned len1, const char *b, unsigned len2, int lenmetrix[len + 1], char cmetrix[len + 1]);

void printmetrix(int lenmetrix[len + 1], char cmetrix[len + 1]);

void printlongestcommonstring(int lenmetrix[len + 1], char cmetrix[len + 1], char *a, int len);

// 優化1:用二維陣列記錄c

void longestcommonstring_4(const char *a, unsigned len1, const char *b, unsigned len2, int lenmetrix[len + 1], char cmetrix[len + 1]);

#include #include "11_longestcommenstring.h"

void testlongestcommenstring()

void longestcommonstring(const char *a, unsigned len1, const char *b, unsigned len2, int ** &lenmetrix, char ** &cmetrix)

for (unsigned i = 0; i < len2; ++i)

for (unsigned i = 0; i < len1; ++i)

else

}else

else

}else // 0 1 / 1 0 / 0 0

else if (j > i)

else // 0 0}}

} }}// 從後往前算

void longestcommonstring_2(const char *a, unsigned len1, const char *b, unsigned len2, int lenmetrix[len + 1], char cmetrix[len + 1])

for (unsigned i = 0; i <= len2; ++i)

for (int i = len1 - 1; i >= 0; --i)

else if (lenmetrix[i + 1][j] > lenmetrix[i][j + 1])

else

} }}

// 從前往後

// 第一行都不用

void longestcommonstring_3(const char *a, unsigned len1, const char *b, unsigned len2, int lenmetrix[len + 1], char cmetrix[len + 1])

for (unsigned i = 0; i <= len2; ++i)

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

else if (lenmetrix[i - 1][j] > lenmetrix[i][j - 1])

else

} }}

void printmetrix(int lenmetrix[len + 1], char cmetrix[len + 1])

cout << endl;

} cout << "----------------------------------" << endl;

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

cout << endl; }}

void printlongestcommonstring(int lenmetrix[len + 1], char cmetrix[len + 1], char *a, int len)

}}/*

優化:只需要c[i-1] c[i]

*/void longestcommonstring_4(const char *a, unsigned len1, const char *b, unsigned len2, int lenmetrix[len + 1], char cmetrix[len + 1])

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

// lenmetrix[0][j]:儲存的是[i-1][j]

// lenmetrix[1][j-1]:儲存的是[i][j-1]

else if (lenmetrix[0][j] > lenmetrix[1][j - 1])

else

}}}

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

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...