題幹:
描述編寫乙個程式,求兩個字串的最長公共子串。輸出兩個字串的長度,輸出他們的最長公共子串及子串長度。如果有多個最長公共子串請輸出在第乙個字串中先出現的那乙個。
特別注意公共子串中可能包含有空格,但不計回車符!
輸入兩個字串,回車結尾,每個字串中都可能含有空格(每個字串的長度不超過200個字元)
輸出一共有四行,前兩行以length of string1:和length of string2:開始冒號後面分別輸出兩字串的長度。 第三行maxsubstring:輸出符合題目裡描述的子串。第四行是length of maxsubstring:加子串長度。注意!冒號後面不要輸出多餘的空格!
輸入樣例 1
this is a string輸出樣例 1my string is abc
length of string1:16輸入樣例 2length of string2:16
maxsubstring: string
length of maxsubstring:7
abcdef輸出樣例 2defabc
length of string1:6輸入樣例 3length of string2:6
maxsubstring:abc
length of maxsubstring:3
aabbcc輸出樣例 3aabbcc
length of string1:6解題報告:length of string2:6
maxsubstring:aabbcc
length of maxsubstring:6
這題做法很多,好像直接n^2暴力判斷也可以水過,就是從s1字串的每乙個字元當成首字元,看最長能延伸到**(也就是跟s2最長匹配到**),這裡要注意跟s2找到第乙個不匹配的字元(假設是ss字元)的時候記錄下tmplen,但是不能直接break,需要繼續搜後面的s2,因為有可能還有長度tmplen2 > 剛剛記錄的tmplen。這裡搜的時候需要從ss開始搜也可以過,但是其實應該是從上乙個第乙個匹配的字元的下乙個字元 開始搜。也許是資料出水了吧。總之**比較冗長,何不試試更好想的方法?
直接列舉這個長度,從len1開始倒著列舉內層迴圈正著遍歷(因為題目要求輸出最長的最靠前的),然後每一次列舉都判斷是否s1和s2中有匹配的,如果有那就直接break掉並且輸出即可。
下面上法2的**:
ac**:
#include#include#include#include#include#include#include#include#define ll long long
const ll mod = 1e9+7;
using namespace std;
char s1[5005],s2[5005],tmp[5005];
int main()
{ cin.getline(s1+1,1004);
cin.getline(s2+1,1004);
int len1 = strlen(s1+1);
int len2 = strlen(s2+1);
int ans,flag = 0;
for(ans = len1; ans >=0; ans--) {
for(int i = 1; i<=len1-ans+1; i++) {
for(int j = 0; j總結:
ps剛開始這題寫錯了wa3次,因為看成了公共子串行問題了,,,想dp來著,後來發現讀錯題了。
最長公共子串行 最長公共子串
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...