C语言求最长公共单词——北航2013年考研991 程序设计题
- 题目要求
请编写出一c语言函数char * maxword(char * a,char * b),该函数的功能是求出字符串a和字符串b的最长公共单词(这里,假设两个字符串均由英文字母和空格组成);若找到这样的公共单词,函数返回该单词,否则返回NULL.
例如:若a=”This is C programming text”,b=”This is a text of C programming”,则函数返回”programming”.
要求:
- 函数不得设置保存单词的存储空间;
- 给出函数之前请用文字简要叙述函数的基本思想.
- 基本思想:
在a字符串中每找到一个单词的开始位置就在b字符串中进行单词匹配,如果单词匹配成功则与之前保存的匹配单词长度进行比较,如果更长则保存新的单词(在a字符串中)的起始和结束索引.如此遍历a中的每个单词后程序返回a字符串的最长公共单词部分(起始索引到结束索引的部分)即可.
/**********************************
2015.12.14 杭健
*********************************/
#include
char a[]= "i am xuemudan hangjianhangjian";
char b[]= "23452345 hangjianhangjia ersgrg sadad hangjianhangjian";
/**
求最大公共单词的函数,输入两个字符串,返回最大公共单词
*/
char * fun(char * ant, char * bnt)
{
char * a = ant;
char * b = bnt;
int begin = 0,end = 0;
int beginNow = 0,endNow = 0;
while(*a != '\0')
{
b = bnt;
if(beginNow == 0 || *(a - 1) ==' ')
{
while(*b!= '\0')
{
if(( beginNow == 0 || *(b - 1) ==' ' ) && (*b== *a) )
{
char * bb = b ;
char * aa = a;
endNow = beginNow;
while(1)
{
if(*bb!= *aa)break;
if( (*(bb + 1) ==' ' && (*(aa + 1) ==' ' || *(aa + 1) =='\0')) ||
((*(bb + 1) =='\0') && (*(aa + 1) ==' ' || *(aa + 1) =='\0')) )
{
if( (endNow - beginNow) > (end - begin) )
{
end = endNow;
begin = beginNow;
}
break;
}
bb++;
aa++;
endNow++;
}
}
b++;
}
}
a++;
beginNow++;
}
if(begin == 0 && end == 0)return NULL;
ant[++end] = '\0';
return ant + begin;
}
int main()
{
printf(fun(a,b));
return 0;
}