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