poj 1934 Trip 多個最長公共子串行

2021-06-10 20:34:08 字數 1506 閱讀 6845

題目要你按字典序輸出兩個字串的多個最長公共子串行 **

思路:

先用動態規劃求兩個字串的最長公共子串行的儲存在

dp[i][j];dp[i][j]

表示s1

字串1到i

和s2字串1到j

的最長公共子串行的長度

然後用兩個變數

last1[i][j],last2[i][j]

來分別儲存字元

j(a的序號為0,

b的序號為1,

.....z

的序號為

25)在字串

1-i中出現的最大標號,要是字元

j沒有出現,則

last[i][j]= 0;

然後從兩個字串的長度

len1

和len2

開始列舉

a---z字元,

比如開始

t1 = last1[len1][0], t2 = last2[len2][0]表示a

在s1字串1---len1

的最大下標為

t1, 在s2

字串1--len2

的最大下標為

t2,那麼若

dp[t1][t2]

的值為s1和s2

的最大公共子串行長度

cnt則表示這個字元符合,儲存起來,否則列舉下乙個字元

b。若滿足情況的話,在繼續在

t1-1

和t2 - 1

符合最大公共子串行為

cnt - 1

的字串儲存,如此迴圈,知道到達最長公共子串行為

0時結束。把儲存的字串放入

set集合裡面,讓它按字典序排序。

#include #include #include #include #include using namespace std;

int const maxn = 100;

char s1[maxn], s2[maxn], tmp[maxn];

int dp[maxn][maxn], last1[100][30], last2[100][30], len1, len2, cnt;

setcollection;

void lca();

void handle(char s, int len, int last[30]);

void find(int index1, int index2, int len);

int main()

void lca()

}len1 = i - 1;

len2 = j - 1;

}void handle(char s, int len, int last[30])

}if(k == 0)

last[j][i] = 0;}}

}void find(int index1, int index2, int len)

if(index1 > 0 && index2 > 0)}}

}

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

最長公共子串行 poj1458 問題描述 給出兩個字串,求出這樣的乙個最長的公共子串行的長度 子串行中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的先後順序一致。sample input abcfbc abfcab programming contest abcd mnp samp...

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

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 當然我們現在一眼就可以看出來最長公...