<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;
}
总的来说,这个算法效率也不是挺高,但我目前能想到的方法就是这个了。。。