用C语言编程,求两个字符串中的最长公共单词
用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;}
[解决办法]
楼上的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()比较
[解决办法]
感觉不应该那么复杂吧…………额 以后再说 先睡觉了…………
[解决办法]
最长子序列,动态规划。