http://acm.hdu.edu.cn/showproblem.php?pid=1238
求几个序列的最长相同子序列,这道题本来一直在想怎么用dfs方法解决,后来看了大牛的结题思路,才明白字符串的长度才100,穷举也可以过。
只要先找到最短的子序列,遍历出一个子序列,把它的顺逆序列分别保存到s1和s2中,再用strstr()函数就可以了。
代码:
#include<iostream>
using namespace std;
int T,n;
char str[105][105],s1[105],s2[105];
int main(){
cin >> T;
int MIN,len,f,flag,MAX;
while (T--)
{
flag = 1;
MIN = 200;
cin >> n;
for (int i = 0; i < n; i++){
scanf("%s",str[i]);
len = strlen(str[i]);
if (MIN>len){
MIN = len;
f = i;
}
}
len = strlen(str[f]);
MAX = 0;
for (int i = 0; i < len; i++){
for (int j = i; j < len&&flag; j++){
for (int k = i; k <= j; k++){
s1[k-i] = str[f][k];
s2[j-k] = str[f][k];
}
s1[j - i + 1] = s2[j - i + 1] = '\0';
int l = strlen(s1);
if (l < MAX) continue;
for (int k = 0; k < n; k++){
if (!strstr(str[k], s1) && !strstr(str[k], s2)){
flag = 0;
break;
}
}
if (l>MAX&&flag){
MAX = l;
}
}flag = 1;
}
cout << MAX << endl;
}
return 0;
}