題目要你按字典序輸出兩個字串的多個最長公共子串行 **
思路:
先用動態規劃求兩個字串的最長公共子串行的儲存在
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 當然我們現在一眼就可以看出來最長公...