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

用C语言编程,求两个字符串中的最长公共单词,该怎么解决

2012-04-13 
用C语言编程,求两个字符串中的最长公共单词用C语言编程,求两个字符串中的最长公共单词[解决办法]C/C++ cod

用C语言编程,求两个字符串中的最长公共单词
用C语言编程,求两个字符串中的最长公共单词

[解决办法]

C/C++ code
//最长公共子序列字符个数//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;}
[解决办法]
楼上的lcs算法是求最大公共序列(字符串),会不会和LZ求单词的意图不一样啊
楼主是什么意思呢?
[解决办法]
等高人解答。··
[解决办法]
以下代码也是我在网上找到的,楼主你看行不。
#include<stdio.h>
#include<iostream.h>
#include<string.h>

void compare( char *b1[], int n1, char *b2[], int n2 );
void main()
{
 char a1[ 100 ];
 char *p, *q;
 int i, j, n1 = 0;
 char *b1[ 50 ];//字符指针数组
 printf("Please input a sentence:\n");
 gets( a1 );
 p = a1;
 while( *p != '\0' ) {
if( *p == ' ') {//跳过空格
p++;
continue;
}
else {
i = 0;
while( *( p + i ) != ' ' && *( p + i ) != '\0' )
i++;
q = new char[ i + 1 ];//创建一个新的字符数组,存储单词
for( j = 0; j < i; j++ )
q[ j ] = p[ j ];
q[ i ] = '\0';//记得放上结束符
b1[ n1++ ] = q;//用字符数组中的元素指向新创建的字符数组
p += i;
}
 }
//建立另一个句子,操作同上
 char a2[ 100 ];
 int n2 = 0;
 char *b2[ 50 ];
 printf("Please input another sentence:\n");
 gets( a2 );
 p = a2;
 while( *p != '\0' ) {
if( *p == ' ') {//跳过空格
p++;
continue;
}
else {
i = 0;
while( *( p + i ) != ' ' && *( p + i ) != '\0' )
i++;
q = new char[ i + 1 ];//创建一个新的字符数组,存储单词
for( j = 0; j < i; j++ )
q[ j ] = p[ j ];
q[ i ] = '\0';//记得放上结束符
b2[ n2++ ] = q;//用字符数组中的元素指向新创建的字符数组
p += i;
}
 }

 printf( "\nsearch result:\n" );
 compare( b1, n1, b2, n2 );

 for( i = 0; i < n1; i++ )
delete []b1[i];//释放各个字符数组

 for( i = 0; i < n2; i++ )
delete []b2[i];//释放各个字符数组
}
 
void compare( char *b1[], int n1, char *b2[], int n2 )
{
 int i, j, temp;
 int maxLength = 0, tag = 0;
 int flag = 0;
 for( i = 0; i < n1; i++ ){
temp = strlen( b1[ i ] );
for( j = 0 ; j < n2 ; j++ )
if( temp > maxLength && strcmp( b1[ i ], b2[ j ] ) == 0 ) {
maxLength = temp;
tag = i;
flag = 1;
}
 }
 if( flag ) printf( "%s\n", b1[ tag ] );
 else printf( "None\n" );
}

 
//测试:
//输入第一句:Oh, my god! English is popular nowadays!
//输入第二句: But my English sucks!
//输出:English

//若第二句输入: But my Chinese sucks!


//输出:my


呼呼,搞定了,好累。。。。主要操作是将英文句子的每个单词转换为字符串,然后用strcmp()比较


[解决办法]
感觉不应该那么复杂吧…………额 以后再说 先睡觉了…………
[解决办法]
最长子序列,动态规划。

热点排行