20151215最长公共单词

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”.
    要求:
    1. 函数不得设置保存单词的存储空间;
    2. 给出函数之前请用文字简要叙述函数的基本思想.

  • 基本思想:
    在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指针归位 
        b = bnt;
        //如果a字符串中找到了一个单词的起始位置,则开始在b字符串中循环
        if(beginNow == 0 || *(a - 1) ==' ')
        {
            while(*b!= '\0')
            {
                //如果b中循环到了一个单词的启示位置,开始匹配单词 
                if(( beginNow == 0 || *(b - 1) ==' ' ) && (*b== *a) )
                {
                    //为了匹配单词,将两个字符串的指针备份 
                    char * bb = b ;
                    char * aa = a;
                    //将结束位置指向开始位置(如果匹配直接失败长度自然应该为零) 
                    endNow = beginNow;
                    while(1)
                    {
                        //匹配失败则跳出循环 
                        if(*bb!= *aa)break;
                        //如果b字符串中的单词和a字符串中的单词同时结尾(匹配成功) 
                        //if((*(bb + 1) ==' ' )|| *(bb + 1) =='\0')
                        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字符串中的单词起始位置或匹配失败则继续遍历b字符串直到b字符串结束 
                b++;
            }
        }
        //继续遍历a字符串寻找a中的单词起始位置并将 临时起始位置索引 自增     
        a++;
        beginNow++;
    }
    //如果匹配失败说明没有公共单词,返回NULL 
    if(begin == 0 && end == 0)return NULL;
    //如果有的话将最长公共单词返回 
    ant[++end] = '\0';
    return ant + begin;
}

int main()
{
    printf(fun(a,b));
    return 0;

}

你可能感兴趣的:(编程与算法)