zoukankan      html  css  js  c++  java
  • c语言 在两个英语句子中寻找最大的共同单词并返回其长度 简单版

    题目:

    编写一个程序,输入两个英文句子,每个句子里英文单词之间用空格分割,最后输出两者的最长公共单词

    思路:

    切分两个句子为一个一个的单词,分别存放到两个可以容纳很多单词的结构体数组中,并且结构体还可以存放这个单词的长度

    然后拿第一句话中的单词和第二句话中的单词一一做对比即可

    #include<stdio.h>
    #include<string.h>
    typedef struct{//定义一个结构体,存放单词和其单词对应的长度
        char w[15];
        int len;
    }words;
    
    typedef struct{//定义一个存放最长单词信息的结构题题
        char a[15];
        int maxlen;
    }maxone;
    
    void replace(char a[])//替换函数,将句子当中的标点符号换成空格
    {
        for(int i=0;a[i]!='';i++)
            if(a[i]=='.')
                a[i]=' ';
    }
    void cut(words one[],char a[])//切分函数,将句子中的单词切分出来放到words结构题当中保存
    {
        for(int i=0,j=0;a[i]!='';i++)//i在a中循环,j在one中循环,k在one.a中循环
        {
            int k=0;
            while(a[i]!=' ')//以空格为一个单词的做区分
                one[j].w[k++]=a[i++];//单词中的字母挨个存放到one数组的每个保存单词的字符串当中
            one[j].w[k]='';//给最后一项给一个结束符号,上述方法编译系统不会主动添加结束符号
            one[j].len=(int)strlen(one[j].w);//获取单词的长度放到单词的长度len变量当中保存
            //此时,w得到一个单词,而a[i]遇到空格,通过for循环里面的i++跳过空格
            ++j;//结构体数组换到下一个,来保存下一个单词的信息
        }
    }
    int show(words word[])//显示单词并返回这个结构题当中保存了多少个单词
    {
        int cnt=0;//计数器设为0
        for(int i=0;i<10;i++)
            if(word[i].len){//若长度不为0则认为是有效的单词
                ++cnt;//计数器自加
                printf("%s	",word[i].w);//显示这个单词
            }
        return cnt;//返还结构体数组中保存了多少个单词
    }
    maxone find(words one[], words two[],int len_one,int len_two)//寻找共同的最大长度的单词
    {
        maxone MAX;//定义一个maxone型结构体保存最大单词的长度
        MAX.maxlen=0;//首先初始化最大单词的长度为1
        for(int i=0;i<len_one;i++)//遍历one,那one中的单词和two一一对比
            for(int j=0;j<len_two;j++)//用two的每一个单词和one[i]做对比
                if(!(strcmp(one[i].w, two[j].w)))//若发现单词一样
                    if(MAX.maxlen<one[i].len)//并且长度还大于已知的最大长度
                    {
                        strcpy(MAX.a,one[i].w);//将找到的最大的共通单词放入MAX结构体中保存
                        MAX.maxlen=one[i].len;
                    }
        return MAX;//返还最大的单词的信息
    }
    int main(){
        char a[]="hello everyone this is micheal here and please.";
        char b[]="hello everybody this is edward here and please go on.";
        words one[10];//执行cut函数,将切分好的单词放到one当中
        words two[10];//同理,切分好以后放入two中
        
        replace(a);//移除句子中的句号
        replace(b);
        
        for(int i=0;i<10;i++)//初始化每一个结构体中的变量
        {
            one[i].w[0]='1';
            one[i].len=0;
            two[i].w[0]='1';
            two[i].len=0;
        }
        cut(one, a);//执行切分函数,切好的单词和单词对应的长度放入结构体中保存
        cut(two, b);
        
        int len_one=show(one);//获得one中有效的单词的个数
        printf("
    ");
        int len_two=show(two);//同理
        
        printf("
    len_one=%d
    ",len_one);//检验切分的单词数量是否正确
        printf("len_one=%d
    ",len_two);
        
        maxone MAX=find(one, two, len_one, len_two);//通过比对获得最长的单词的数量
        printf("%s
    %d
    ",MAX.a,MAX.maxlen);
    }

    运行截图:

     

  • 相关阅读:
    重写Nacos服务发现逻辑动态修改远程服务IP地址
    手撸一个SpringBoot配置中心实现配置动态刷新
    使用CompletableFuture实现多个异步任务并行完成后合并结果
    SpringBoot实现Flyway的Callback回调钩子
    Java实现相似结构表算法
    使用Druid解析SQL实现血缘关系计算
    记一次解决RestTemplate和HttpClient请求结果乱码的问题
    double转json格式化添加自定义注解
    了解23种设计模式
    BigDecimal四舍五入
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13590466.html
Copyright © 2011-2022 走看看