pku Blue Jeans 字符串匹配

http://poj.org/problem?id=3080

学习:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html

才开始自己,思路搞错了,先把前两个求最长公共子序列,然后依次用最长公共子序列与2,3,4,。。。m比较求最长公共子序列。。贡献了3次wa

直到看到这组数句才发现自己的错误:

1
3
AAATTTGGG
TTTGGGAAA
GGGTTTAAA
print:AAA
按我的思路会输出TTT的。。唉。。因为前两个最长公共子序列为TTTGGG再将它与第三组比较时,就出来TTT了。而第1,2组可以得到AAA然后在于第三组的AAA才是正确结果。。。没有考虑全面。。
下面直接用函数strstr确定子序列位置爱查找,就避免了这样的错误。。
View Code
#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 65
using namespace std;

char str[12][maxn];
char tmp[maxn],ans[maxn];
int n,m;

void solve()
{
int i,j,k,l;
int maxlen = 0;
int len = strlen(str[0]);
//O(60^2*m)复杂度
for (i = 0; i < len; ++i)
{
for (j = i; j < len; ++j)
{
memset(tmp,0,sizeof(tmp));
l = 0;
for (k = i; k <= j; ++k)
tmp[l++] = str[0][k];//找出子序列
for (k = 1; k < m; ++k)
{
if (strstr(str[k],tmp) == NULL)//判断子序列在串中出现的首位置,如果没有返回空
//第一次使用这个函数。。
break;
}
if (k == m)
{
if (l > maxlen)
{
strcpy(ans,tmp);
maxlen = l;
}
else if (l == maxlen && strcmp(ans,tmp) > 0)
{
strcpy(ans,tmp);
}
}
}
}
if (maxlen >= 3)
printf("%s\n",ans);
else
printf("no significant commonalities\n");
}
int main()
{
int i;
cin>>n;
while (n--)
{
cin>>m;
for (i = 0; i < m; ++i)
cin>>str[i];
solve();
}
return 0;
}

KMP算法实现
View Code
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 65
using namespace std;

char str[12][maxn];
char ans[maxn],tmp[maxn];
int n,m;
int next[maxn];

void get_next(char *p,int len)
{
    int i,j;
    i = 0; j = -1;
    next[0] = -1;
    while (i < len)
    {
        if (j == -1 || p[j] == p[i])
        {
            i++; j++;
            next[i] = j;
        }
        else
        j = next[j];
    }
}
bool kmp(char *p,int len)
{
    int i,j,k;
    memset(next,0,sizeof(next));
    get_next(p,len);
    for (k = 1; k < m; ++k)
    {
        int slen = strlen(str[k]);
        i = 0; j = 0;
        while (i < slen && j < len)
        {
            if (j == -1 || p[j] == str[k][i])
            {
                i++; j++;
            }
            else
            {
                j = next[j];
            }
        }
        if (j < len) break;
    }
    if (k == m) return true;
    else return false;
}
void solve()
{
    int i,j,k;
    int len = strlen(str[0]);
    int maxlen = 0;
    for (i = 0; i < len; ++i)
    {
        for (j = i; j < len; ++j)
        {
            memset(tmp,0,sizeof(tmp));
            int l = 0;
            for (k = i; k <= j; ++k)
            {
                tmp[l++] = str[0][k];
            }
            if (kmp(tmp,l))
            {
                if (l > maxlen)
                {
                    maxlen = l;
                    strcpy(ans,tmp);
                }
                else if (l == maxlen)
                {
                    strcpy(ans,tmp);
                }
            }
        }
    }
    if (maxlen >= 3)
    printf("%s\n",ans);
    else
    printf("no significant commonalities\n");
}
int main()
{
    int i;
    cin>>n;
    while (n--)
    {
        cin>>m;
        for (i = 0; i < m; ++i)
        cin>>str[i];
        solve();
    }
    return 0;
}

 



posted @ 2012-03-22 20:55  E_star  阅读(272)  评论(0编辑  收藏  举报