首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有关2个字符串最长公共部分的有关问题

2013-10-27 
有关2个字符串最长公共部分的问题如有2个字符串abcdefg[b]和[b]efhabc他们的公共部分有abc和ef最长的是abc

有关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; 
}

热点排行