/**
* 書本:《演算法分析與設計》
* 功能:若給定序列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,那麼 用...