读书人

求最长公共子串错在哪里?该怎么处理

发布时间: 2012-04-14 17:14:21 作者: rapoo

求最长公共子串,错在哪里?
#include<stdio.h>
#include<string.h>
void GetCommon(char *s1, char *s2, char **r1, char **r2);
void main()
{
char str1[100],str2[100],*p1,*p2,**r1,**r2;
p1=str1;
p2=str2;
*r1=p1;
*r2=p2;
gets(p1);
gets(p2);
GetCommon(p1,p2,r1,r2);
}

void GetCommon(char *s1, char *s2, char **r1, char **r2)
{
int i,j,as,bs,maxlen = 0,count=0;
int len1 = strlen(s1);
int len2 = strlen(s2);


for(i = 0; i < len1; i++)
{
for(j = 0; j < len2; j++)
{

if(s1[i] == s2[j])
{
as = i, bs = j, count = 1;
while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])
count++;

if(count > maxlen)
{
maxlen = count;
*r1 = s1 + i;
*r2 = s2 + j;
}
}

}
}
puts(*r1);
puts(*r2);
}

[解决办法]

C/C++ code
*r1=p1;*r2=p2;
[解决办法]
这个问题重点是算法 不是你的指针问题

状态转移方程dp[i][j] = {dp[i-1][j-1]+1(a[i] == b[j]) max{dp[i-1][j],dp[i][j-1]}(a[i] != b[j])}

求最长公共子序列的长度
时间限制:1000 ms | 内存限制:80 KB 看好了这里 80K的内存
描述
给定两个字符串,要求统计两个字符串的最长公共子序列的长度。

要求:尽量节省空间。

输入
第一行一个整数T ,表示有T组测试数据:

对于每组测试数据,有两行,即两个字符串(长度小于等于1000,只由小写字母组成)。

输出
对于每组测试数据:输出一行,即最长公共子序列的长度。

样例输入
1
god
good
样例输出
3

C/C++ code
#include <stdio.h>#include <string.h>int main(){    short i,j,k,n;    scanf("%d",&n);    getchar();    while(n--)    {        char a[1001] = {0};        char b[1001] = {0};        short row[1001] = {0};        gets(a+1);        gets(b+1);        short lena = strlen(a+1);        short lenb = strlen(b+1);        short mem[4] = {0};        for(i = 1;i<=lena;i++)        {                        for(j = 1;j<=lenb;j++)            {                if(1 == j)                    mem[0] = mem[2] = 0;                if(1 == i)                    mem[0] = mem[1] = 0;                if(a[i] == b[j])                {                    mem[3] = mem[0]+1;                    mem[0] = row[j];                    mem[2] = mem[3];                    mem[1] = row[j+1];                    row[j] = mem[3];                }                else                {                    mem[3] = row[j]>mem[2]?row[j]:mem[2];                    mem[0] = row[j];                    mem[2] = mem[3];                    mem[1] = row[j+1];                    row[j] = mem[3];                }            }        }        printf("%d\n",mem[3]);    }    return 0;}
[解决办法]
LZ去看看算法导论吧~上面讲的很清楚..

读书人网 >C语言

热点推荐