序列比对(23)最长公共子字符串
- 2019 年 10 月 4 日
- 筆記
本文介绍如何求解两个字符串的最长公共子字符串。
其实这个问题可以放在序列比对
专题的最开始,只是笔者是个新手,所以当初只是照《生物序列分析》教材的进度写的,教材是直接从全局比对开始讲的。Anyway,我们在本文介绍也不迟。

刚开始接受编程训练时,很容易想到利用三层循环求解。在此就不赘述了。

回溯的时候从得分矩阵的最大值所在单元开始,一直到值为0的单元。
效果如下:

当然,笔者还想过如果是用多层循环的话,可以考虑结合KMP算法。当然,这只是一个想法,没有去实现。
动态规划解法的代码
具体代码如下: (代码是在《序列比对(一)——全局比对Needleman-Wunsch算法》一文代码的基础上修改,没有优化,但足以说明本文问题了。)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSEQ 1000 void strUpper(char *s); void printAlign(int** a, const int i, const int j, char* s, char* r, int n); void align(char *s, char *r); int main() { char s[MAXSEQ]; char r[MAXSEQ]; printf("The 1st seq: "); scanf("%s", s); printf("The 2nd seq: "); scanf("%s", r); align(s, r); return 0; } void strUpper(char *s) { while (*s != '