有关2个字符串最长公共部分的问题
如有2个字符串abcdefg[b]和[b]efhabc
他们的公共部分有abc和ef最长的是abc,abc即为这连个字符串的最长公共部分
我写了一个程序可是运行不出结果求教育
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
char a[80],b[80],c[80],d[500][80];
int i,j,m,n,t,k;
gets(a);
gets(b);//输入字符串
puts(a);
puts(b);//输出字符串
m=strlen(a);
n=strlen(b);//计算字符串实际长度
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
t=0;
c[t]=a[i];
t=t+1;
i=i+1;
j=j+1;
}//寻找字符串公共部分并赋值给c
if(strlen(c)>1)
{
k=0;
strcpy(d[k],c);
k=k+1;
}
}//把公共部分放入d[i]中
strcpy(c,d[0]);//把d中第一行赋值给c
for(i=1;i<k-1;i++)
{
if(strlen(c)<strlen(d[i]))
strcpy(c,d[i]);//如果d[i]字符串长度比c长就把d[i]中的字符串复制给c
}
puts(c);
return 0;
}
运行不出来,找不到原因,求大神教育。 c
[解决办法]
仅供参考
//最长公共子序列字符个数
//c[i][j]保存字符串 {xi},{yj},(长度分别为i,j)的最长公共子序列的字符个数
//i=0或者是j=0 时,c[i][j]必定为零, i,j>=0 且 xi=yj, c[i][j]=c[i-1][j-1]+1
//若 i,j>0 但xi!=yj, c[i][j]=max{ c[i-1][j] , c[i][j-1] }
#include <stdio.h>
#include <string.h>
int c[1001][1001];
void lcs(int a, int b, char x[], char y[], int c[][1001]) {
int i,j;
for(i=1;i<a;i++)
c[i][0]=0; //if b==0, set c[i][j]=0;
for(i=1;i<b;i++)
c[0][i]=0; // if a==0; set c[i][j]=0;
for(i=1;i<=a;i++) // if a!=0,b!=0 loop
for(j=1;j<=b;j++) {
if(x[i-1]==y[j-1])
c[i][j]=c[i-1][j-1]+1;
else if (c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j];
else
c[i][j]=c[i][j-1];
}
}
int main() {
char x[1001],y[1001];
while ( scanf("%s%s",x,y)!=EOF ) {
int a=strlen(x);
int b=strlen(y);
memset(c,0,sizeof(c));
lcs(a,b,x,y,c);
printf("%d\n",c[a][b]);
}
return 0;
}
[解决办法]
这里的问题还不少,调试这个程序用了我半个小时,在VS2008里测试了几个,可以得出正确答案:
int main()
{
char a[80],b[80],c[80],d[500][80];
memset(c, 0, 80);
int i,j,m,n,t,k;
gets(a);
gets(b);//输入字符串
puts(a);
puts(b);//输出字符串
m=strlen(a);
n=strlen(b);//计算字符串实际长度
int nFlag = 0;
k = 0;
int nTemp = 0;
for(i=0;i<m;i++)
{
nFlag = 0;
t=0;
nTemp = i;
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
nFlag = 1;
c[t]=a[i];
t=t+1;
i=i+1;
//j=j+1;
}//寻找字符串公共部分并赋值给c
else
{
if (nFlag == 1)
{
strcpy(d[k++], c);
memset(c, 0, 80);
nFlag = 0;
t=0;
i = nTemp;
j=j-1;
}
}
}//把公共部分放入d[i]中
if (nFlag == 1)
{
strcpy(d[k++], c);
memset(c, 0, 80);
i = nTemp;
}
}
strcpy(c,d[0]);//把d中第一行赋值给c
for(i=1;i<k-1;i++)
{
if(strlen(c)<strlen(d[i]))
strcpy(c,d[i]);//如果d[i]字符串长度比c长就把d[i]中的字符串复制给c
}
puts(c);
return 0;
}