qduoj 最長公共子串

2021-08-27 00:17:31 字數 1806 閱讀 1376

題幹:

描述編寫乙個程式,求兩個字串的最長公共子串。輸出兩個字串的長度,輸出他們的最長公共子串及子串長度。如果有多個最長公共子串請輸出在第乙個字串中先出現的那乙個。

特別注意公共子串中可能包含有空格,但不計回車符!

輸入兩個字串,回車結尾,每個字串中都可能含有空格(每個字串的長度不超過200個字元)

輸出一共有四行,前兩行以length of string1:和length of string2:開始冒號後面分別輸出兩字串的長度。 第三行maxsubstring:輸出符合題目裡描述的子串。第四行是length of maxsubstring:加子串長度。注意!冒號後面不要輸出多餘的空格!

輸入樣例 1 

this is a string

my string is abc

輸出樣例 1

length of string1:16

length of string2:16

maxsubstring: string

length of maxsubstring:7

輸入樣例 2 

abcdef

defabc

輸出樣例 2

length of string1:6

length of string2:6

maxsubstring:abc

length of maxsubstring:3

輸入樣例 3 

aabbcc

aabbcc

輸出樣例 3

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