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

2021-08-19 21:51:18 字數 1397 閱讀 6575

最長公共子串行

poj1458

問題描述

給出兩個字串,求出這樣的乙個最長的公共子串行的長度:

子串行中的每個字元都能在兩個原串中找到,

而且每個字元的先後順序和原串中的先後順序一致。

sample input

abcfbc abfcab

programming contest

abcd mnp

sample output

4

20

問題分析

輸入兩個串s1,s2,

設maxlen(i,j)表示:

s1的左邊i個字元形成的子串,與s2左邊的j個字元形成的子串的最長公共子串行的長度(i,j從0開始算)

maxlen(i,j) 就是本題的「狀態」

假定 len1 = strlen(s1),len2 = strlen(s2)

那麼題目就是要求 maxlen(len1,len2)

顯然:

maxlen(n,0) = 0 ( n= 0…len1)

maxlen(0,n) = 0 ( n=0…len2)

遞推公式:

if ( s1[i-1] == s2[j-1] ) //s1的最左邊字元是s1[0]

maxlen(i,j) = maxlen(i-1,j-1) + 1;

else

maxlen(i,j) = max(maxlen(i,j-1),maxlen(i-1,j) );

時間複雜度o(mn) m,n是兩個字串長度

s1[i-1]!= s2[ j-1]時,maxlen(s1,s2)不會比maxlen(s1,s2j-1)

和maxlen(s1i-1,s2)兩者之中任何乙個小,也不會比兩者都大。

所以是等於maxlen(s1,s2j-1)和maxlen(s1i-1,s2)兩者之中大的那個。

ac**

#include

#include

#include

using

namespace

std;

char str1[10000],str2[10000];

int maxlen[10000][10000];

int main()

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

for(int j=1;j<=len2;j++)

cout

0;}

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

二者含義沒搞清楚,雅虎的筆試就這樣的寫錯了。求最長公共字串的題目寫成了最長公共子串行。子串要求字元必須是連續的,但是子串行就不是這樣了。悲催了。子串行跟子串的求法類似,都是使用動態規劃的思想,s1每次增加乙個字元,看與s2當前位置的字元是不是相同,如果相同做相應的處理,如果不同,做另外的處理。子串行...

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

問題定義 最長公共子串行,序列的意思是順序對就可以,並不需要是連續的。例如 abcde oalblcldle其中abcde就是這兩個字串的最長公共子串行。容易知道乙個長度為n的字串的子串行有2 n 個,假設兩個字串的長度都為n,直接去求解兩個字串的最長公共子串行需要用這2 n 個序列串去匹配另外乙個...

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

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