演算法設計與分析 5 最長公共子串行

2021-06-27 12:08:57 字數 1766 閱讀 1109

/**

* 書本:《演算法分析與設計》

* 功能:若給定序列x=,則另一串行z=,是x的子串行是指存在乙個嚴格遞增下標序列

* 使得對於所有j=1,2,。。。,k有:zj=xij.給定兩個序列x=和y=找出x和y的最長公共子串行

* 檔案:mostlength.cpp

*/#include #define maxlen 100

using namespace std;

//這是乙個求得最長子序列的長度的函式

//x和y是兩個序列,m和n是長度,c是存放的結果,b是對應的序列序號下之間最長子序列的結構情況

//最長子序列分三種最優子結構

/* i,j > 0; xi != yj 第二和第三類,大小關係分為兩類

*/void lcslength(char *x, char *y, char *z, int m, int n, int c[maxlen], int b[maxlen])

else if (c[i - 1][j] >= c[i][j - 1]) //去掉這個xi剩下的最長子序列和去掉yj剩下的最長子序列的大小比較

else

} }}

//劃分,每次根據上面得到的每層的最優子結構型別劃分,來進行不同的操作

//這裡i和j分別是是x和y對應的第i個j個元素,x就是比較長的那個序列,b是上面求得的結構層次

/* i,j > 0; xi != yj 第二和第三類,大小關係分為兩類

*///這裡引數i和j表示這兩個序列擁有的元素個數

void lcs(int i, int j, char *x, int b[maxlen][maxlen])

else if (b[i][j] == 2) //結構是第二類的時候,說明xi比yj大

else //結構是第三類的時候,說明xi比yj大 }

int main()

; char y = ;

char z[maxlen] = ;

const int m = sizeof(x) / sizeof(x[0]);

const int n = sizeof(y) / sizeof(y[0]);

//x和y是兩個序列,m和n是長度,c是存放的結果,b是對應的序列序號下之間最長子序列的結構情況

int c[maxlen][maxlen] = ;

int b[maxlen][maxlen] = ;

lcslength(x, y, z, m, n, c, b);

//輸出相應的長度序列

//cout << "這是什麼!" << endl;

//for (int k = 0; k <= n; ++k)

// cout << k << " " << endl;

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

}cout << endl;

} /*

//求出b的值

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

2 1 3 3

2 2 2 2

2 2 1 3

//求出c

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

0 1 1 1

0 1 1 1

0 1 2 2

*/ cout << "最長公共子串行是:" << endl;

lcs(m-1, n-1, x, b);

cout << endl;

return 0;

}

演算法設計與分析 最長公共子串行

問題描述 給定兩個字串,求解這兩個字串的最長公共子串行 longest common sequence 比如字串1 bdcaba 字串2 abcbdab 則這兩個字串的最長公共子串行長度為4,最長公共子串行是 bcba 問題解決 1 窮舉法 列舉出所有的可能,但其時間複雜度較高不可取。2 遞迴法 設...

演算法設計與分析 2 最長公共子串行

有序列x 和y 找出它們的最長公共子串行。可以按以下方式遞迴進行 當xm yn時,找出xm 1與yn 1的最長公共子串行,然後在尾部加上xm xm yn 即可得x與y的最長公共子串行。當xm不等於yn時,必須解兩個子問題,即找出xm 1與y的最長公共子串行及x與yn 1的最長公共子串行,這兩個公共子...

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

最長公共子串行 常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。最長公共子串 是指在母串中連續出現的子串。例如 cnblogs belong 最長公共子串行為blog,最長公共子串為lo假設z z2,zk 是母串 x 與 y的最長公共子串行lcs,那麼 用...