【分享】查找最长匹配单词,希望得到大家的建议,谢谢

solo7773 2012-08-16 09:02:17
s[]="This is C programmer plaintext";
t[]="This is a plaintext for C programming";
要求就是查找上面两个字符串里面的最长匹配单词。
很久没写C了,折腾了老半天,勉强实现了功能。
感觉还是很差,贴出来希望得到各位的建议,谢谢。

#include<stdio.h>
#include<string.h>
#define LONG 100
#define SHORT 50
int is_sub_str(char *p_long, char * p_short){
int len_long=strlen(p_long), len_short=strlen(p_short);
int i, j;
for(i=0;i<=len_long-len_short;i++){
for(j=0;j<len_short;j++)
if(p_long[i+j]!=p_short[j]) //逐个扫描是否匹配
break;
if(j>=len_short) //子串是否扫描完成
break;
}
if((i==0 || p_long[i-1]==' ') && (p_long[i+j]==' ' || p_long[i+j]=='\0')){
if(i<=len_long-len_short) //疑惑,这里的两个if语句,先后顺序不一样,结果不一样,希望得到解答
return 1; //说明是子串且是单词
}else
return 0;
}
void main(){
char s[]="This is C programmer plaintext";
char t[]="This is a plaintext for C programming";
char temp_word[50], max_word[50]=" ";
int i, n;
for(i=0,n=0;s[i]!='\0';i++){ //提取单词
if(s[i]!=' ')
temp_word[n++]=s[i];
if(s[i+1]==' ' || s[i+1]=='\0'){
temp_word[n]='\0';
n=0;
if(is_sub_str(t, temp_word))
if(strlen(temp_word)>strlen(max_word))
strcpy(max_word, temp_word);
}
}
printf("The longest same word of the two strings is: %s\n", max_word);
}

...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
solo7773 2012-08-17
  • 打赏
  • 举报
回复
谢谢你细心解答,如果换成以下测试条件,交换q1与q2(也就是两个if语句的顺序),会出错。如下:
char s[]="This is C programmin plaintext";
char t[]="This is a plaintext for C programming";
在CB的结果是,会变成 programmin 。
1楼给的测试条件没有这个特殊,这个测试条件能发现错误
[Quote=引用 3 楼 的回复:]

补上vs2005跑的情况:
C/C++ code

q1标示代码,代码中我注释了,代码依旧可以运行。
将q1, q2两处判断调换位置,依然输出 plaintext,你期望的结果。没有出现你所说的。
两个条件都不要,就出错了,输出programmer
[/Quote]
titer1 2012-08-16
  • 打赏
  • 举报
回复
补上vs2005跑的情况:

int is_sub_str(char *p_long, char * p_short){
int len_long=strlen(p_long), len_short=strlen(p_short);
int i, j;
for(i=0;i<=len_long-len_short;i++){
for(j=0;j<len_short;j++)
if(p_long[i+j]!=p_short[j]) //逐个扫描是否匹配
break;
if(j>=len_short) //子串是否扫描完成
break;
}
if((i==0 || p_long[i-1]==' ') && (p_long[i+j]==' ' || p_long[i+j]=='\0')){ //-----------q2
if(i<=len_long-len_short) // ------------------q1
return 1; //说明是子串且是单词
}else
return 0;
}


代码中标示 q1 ,q2,
q1标示代码,代码中我注释了,代码依旧可以运行。
将q1, q2两处判断调换位置,依然输出 plaintext,你期望的结果。没有出现你所说的。
两个条件都不要,就出错了,输出programmer

其实小结:那个找到了单词,然后判断一头一尾的条件q1是最重要的

希望帮助你。。


titer1 2012-08-16
  • 打赏
  • 举报
回复
不好意思,我看错题,

你说的是 最长匹配单词,那么有开头,还有结尾的,
titer1 2012-08-16
  • 打赏
  • 举报
回复
其实简言之,就是 最长公共子串问题 哈

先看代码吧:


/* 最长公共子串 DP */
int dp[30][30];

void LCS_dp(char * X, int xlen, char * Y, int ylen)
{
maxlen = maxindex = 0;
for(int i = 0; i < xlen; ++i)
{
for(int j = 0; j < ylen; ++j)
{
if(X[i] == Y[j])
{
if(i && j)
{
dp[i][j] = dp[i-1][j-1] + 1;
}
if(i == 0 || j == 0)
{
dp[i][j] = 1;
}
if(dp[i][j] > maxlen)
{
maxlen = dp[i][j];
maxindex = i + 1 - maxlen;
}
}
}
}
outputLCS(X);
}
//copyright @ahathinking

我接着看看你的代码哈:

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧