最長公共子串行和最長公共子串 C

2021-10-10 01:31:40 字數 1611 閱讀 1589

一、給定兩個字串s1和s2,求兩個字串的最長公共子串行的長度。

輸入樣例

abcd

aebd

輸出樣例3解釋

s1和s2的最長公共子串行為abd,長度為3

思路動態規劃

lcs(m,n)表示s1[0…m)和s2[0…n)的最長公共子串行的長度

s1[m-1] == s2[n-1]: lcs(m, n) = 1 + lcs(m - 1, n - 1);

s1[m-1] != s2[n-1]: lcs(m, n) = max(lcs(m - 1, n), lcs(m, n - 1))。

#include

#include

#include

using

namespace std;

class

solution

}//找出最長公共子串行的長度

intlengthoflongestcommonsequence

(string& str1, string& str2)

}return dp[m]

[n];

}// 找出所有的最長公共子串行

// 這裡形參lcs_str不可以為引用,這裡需要每次呼叫lcs_str都重新生成乙個物件

void

printalllcs

(string& str1, string& str2,

int i,

int j, string lcs_str)

else}}

all_lcs.

insert

(lcs_str);}

vectorint>> dp;

set all_lcs;};

intmain()

return0;

}/*4abcb

abfb

abfc

*/

二、求兩個字串的最長公共子串,要求子串連續

輸入例子:

babcaba

輸出例子:2思路

動態規劃

dp(m,n)表示s1[0…m)和s2[0…n)的最長公共子串的長度

當s1[m-1]==s2[n-1]: dp(m,n)=1+dp(m−1,n−1);

當s1[m-1]!=s2[n-1]: dp(m,n) = 0。

#include

#include

#include

using

namespace std;

class

solution

}return res;

}//輸出最長公共子串

string lcs

(string str1, string str2)

else

if(len < dp[i]

[j])}}

if(len ==0)

res = str1.

substr

(pos - len, len)

;return res;}}

;int

main()

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

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