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;

}

 



你可能感兴趣的:(字符串)