POJ 3080 Blue Jeans (多个字符串的最长公共序列,暴力比较)

题意:给出m个字符串,找出其中的最长公共子序列,如果相同长度的有多个,输出按字母排序中的第一个。

思路:数据小,因此枚举第一个字符串的所有子字符串s,再一个个比较,是否为其它字符串的字串。判断是否为字串的时候,将s的字符依次与其他字符串的字符比较。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <algorithm> using namespace std;
const int maxm=;
const int maxlen=;
char str[maxm][maxlen]; //存储m个字符串
char s[maxlen],ans[maxlen]; //s存储枚举str[0]的子字符串,ans存储m个字符串序列的最长公共序列
int n,m;
int len; //枚举子字符串的长度 //判断s是否为str[i]的子字符串
bool common(int i){
int flag;
for(int j=;j+len<=;j++){
flag=;
for(int k=;k<len;k++){
if(str[i][j+k]!=s[k]){
flag=;
break;
}
}
if(flag)
return ;
}
return ;
}
//判断子字符串是否为str[1]~str[m]的子字符串
bool isOk(){
for(int i=;i<m;i++){
if(!common(i)){
return ;
}
}
return ;
}
int main()
{
scanf("%d",&n);
while(n--){
int maxl=;
scanf("%d",&m);
for(int i=;i<m;i++)
scanf("%s",str[i]);
for(len=;len<=;len++){
for(int i=;i+len-<;i++){
strncpy(s,str[]+i,len); //将str[0]的前len个字符拷贝到s中去
s[len]='\0';
if(isOk()){
if(len>maxl){
maxl=len;
strcpy(ans,s);
}
//如果长度相同,但s的顺序在ans前,则改变ans值
else if(len==maxl && strcmp(s,ans)<){
strcpy(ans,s);
}
} }
}
if(maxl==)
printf("no significant commonalities\n");
else{
printf("%s\n",ans);
}
}
return ;
}
上一篇:Netty 断线重连解决方案


下一篇:body全屏