最長公共子串(連續) 子串行(不連續)

2021-08-29 16:16:14 字數 1451 閱讀 6392

1、【最長公共子串】

計算兩個字串的最長公共子串的長度,字元不區分大小寫

假設 x 和 y 的序列如下:

x[1...m] =

y[1...n] =

可以看出,x 和 y 的最長公共子串為 「a,s,d,f,a,s」,即長度為6

2、【最長公共子串行】

給定兩個序列:x[1...m]和y[1...n],求在兩個序列中同時出現的最長子序列的長度。

假設 x 和 y 的序列如下:

x[1...m] =

y[1...n] =

可以看出,x 和 y 的最長公共子串行有 「bdab」、「bcab」、「bcba」,即長度為4

1、【最長公共子串】--連續

動態規劃思想,設定dp[i][j]記錄子串x[1,,i]和子串y[1,,j]的公共子串長度,則

dp[i][j] = dp[i-1][j-1]+1   ->   x[i]==y[j]

dp[i][j] = 0

2、【最長公共子串行】--不連續

採用動態規劃的思想,設dp[i][j]為序列x[1...i]和序列y[1...j]的最長公共子串行長度,則

dp[i][j] = dp[i-1][j-1]+1                     ->        x[i]==y[j]

dp[i][j] = max(dp[i-1][j],dp[i][j-1])     ->        x[i]!=y[j]

/**********************************

author:tmw

date:2018-10-22

**********************************/

#include #include #include #define max(a,b) (a>b?a:b)

int findlongestsubstr(char* x, char* y, int x_len, int y_len)

else

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

return max_continue_len;

}

/**********************************

author:tmw

date:2018-10-22

**********************************/

#include #include #include #define max(a,b) (a>b?a:b)

int findlongestcommonsubsequence(char* x, char* y, int x_len, int y_len)

{ int dp[x_len+1][y_len+1];

int i,j;

for(i=0; i夢想還是要有的,萬一實現了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~

最長公共子串(連續)問題

from 動態規劃有乙個經典問題是最長公共子串行,但是這裡的子串行不要求連續,如果要求序列是連續的,我們叫公共子串,那應該如何得到這個串呢?最簡單的方法就是依次比較,以某個串為母串,然後生成另乙個串的所有長度的子串,依次去母串中比較查詢,這裡可以採用先從最長的子串開始,減少比較次數,但是複雜度依然很...

最長公共子串(連續)問題

動態規劃有乙個經典問題是最長公共子串行,但是這裡的子串行不要求連續,如果要求序列是連續的,我們叫公共子串,那應該如何得到這個串呢?最簡單的方法就是依次比較,以某個串為母串,然後生成另乙個串的所有長度的子串,依次去母串中比較查詢,這裡可以採用先從最長的子串開始,減少比較次數,但是複雜度依然很高!然後重...

最長公共子串行問題(不連續)

最長公共子串行 不連續 問題 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。給定兩個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。最長公共子串行就是求給定兩個序列的乙個最長公共子串行。例如,x abcbdab y bcdb 是x的乙個子串行。問題分...