求最长公共子串,错在哪里?
#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去看看算法导论吧~上面讲的很清楚..