最长组合单词

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 问题是这样的:有一个文本文件,里面存放的都是以逗号分隔的单词,</span>
比如:test,tester,testing,works,testworks。。。。。。给出这个文本里一个最长的复合单词,
这个复合单词由文本里其他单词组合而成的,如:testworks由test和works组合而成。

这个问题我想了一天,除了当天面试时想到的用字典树的方法外,后又想到了一种方法,这个方法是:
1、首先对所有单词按照长度排序(从小到大);
2、定义一个数组存放非组合单词,称它为子单词数组,把第一个单词(也是最短的)放进去,然后依次判断后面的是不是这个数组里面的元素组成的;
3、如果是组合词,就不放进这个子单词数组;

伪代码如下:
char **subword;  //这是子单词数组,也就是存放非组合单词的字符数组。
int    num=0;         //用来统计子单词的个数

char *  SearchMaxCombword(char **str)/* 函数功能:查找最长组合单词
{          输入:输入的str 是一个已经按照长度从小到到大排序的字符数组
       if( str == NULL)                                               返回:最长组合单词的地址,找不到则返回NULL
            return NULL;  基本思路:维护一个子单词数组subword,首先把第一个单词(也是最短的)放进去,然后对str进行遍历,依次判断str[i]是不是
       char *maxcombword = NULL;                                        由subword数组里的元素组成的,如果是组合词,这个str[i]就不放进这个子单词数组subword,用 maxcombword 记               下这个当前最长的组合词;如果不是组合词,就把str[i]放进子单词数组subword。       
subword[num] = str[0];                               */
       
for( int i=0; str[i]!=NULL ; i++)
if( IsCombWord(str[i]) )
maxcombword = str[i];
                else 
subword[++num]=str[i];
       return  maxcombword;
}

int   IsCombWord(char * src)                          /* 函数功能:判断单词src是否是组合单词              
{                    输入:待判断的单词
char  *restword=NULL;   返回:src若是组合单词,返回1;否则,返回0
int pos;
for(int i ; subword[i] != NULL ; i++)                      判断方法: 将src和subword中的元素进行前缀匹配,若匹配失败,则取subword中的下一个元素进行前缀匹配,直到将 {         subword中元素匹配完毕,当subword中的所有元素都匹配失败时,则返回0;若匹配成功,用restword记录下
pos = StrPrefixMatch(src,subword[i]);                              剩下的单词,递归判断restword是否是组合单词,当restword为NULL时,表明src是组合单词,返回1。             
                if( pos!=0)      */
                { restword = src+pos;
if( restword != NULL)
return IsCombWord( restword );
else return 1;
}
}
        return 0;
}

int  StrPrefixMatch(char * src,char * sub)                 /* 函数功能:对单词进行前缀匹配
   输入:目标单词src,子单词sub
if(src==NULL || sub==NULL)                                       输出:sub和src的前缀完全匹配时,返回src中除去前缀sub后,下一个字母的位置pos;否则返回0。
return 0;
        for(int i=0; src[i]==sub[i]; i++)
;
         if(sub[i] != '\0')
return 0;
else return i;
}

总的来说,这个算法效率也不是挺高,但我目前能想到的方法就是这个了。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值