求最长公共子序列,这题直接暴力枚举了,先枚举长度为1,然后2...n。以后再用kmp和后缀数组试试。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define LEN 60 int main() { //freopen("temp.txt", "r", stdin); int cases, n; cin >> cases; while (cases--) { cin >> n; char **DNA = new char*[n]; for (int i = 0; i < n; ++i) { DNA[i] = new char[LEN+1]; cin >> DNA[i]; } int maxlen = 0, len = 1, pi, i, j; char obj[LEN+1], dna[LEN+1]; //obj储存最大子串结果 bool flag = true; for (i = 0; ; ++i) { if (i + len > LEN) { i = -1; ++len; if (len > LEN) break; continue; } pi = i; for (j = 0; j < len; ++j) { dna[j] = DNA[0][pi++]; } dna[j] = '\0'; flag = true; for (int j = 1; j < n; ++j) { if (!strstr(DNA[j], dna)) { flag = false; break; } } if (flag) { if (len > maxlen) { maxlen = len; strcpy(obj, dna); } else if (len == maxlen) { if (strcmp(dna, obj) < 0) { strcpy(obj, dna); } } } } if (maxlen < 3) cout << "no significant commonalities" << endl; else cout << obj << endl; } return 0; }