编程珠玑第三章习题5——英语中的连字符问题

2023-10-31

 
 编程珠玑第三章习题5——英语中的连字符问题
问题:
本问题将处理一小部分用连字符连接的英语单词方面的问题。下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接:et-ic al-is-tic s-tic p-tic -lyt-ic ot-ic an-tic n-tic c-tic at-ic h-nic n-ic m-ic l-lic b-lic -clic l-ic h-ic f-ic d-ic -bic a-ic -mac i-ac  应用该规则时,必须按照上述次序进行;从而导致了"ethnic"(遵循规则"h-nic")和"clinic"(不满足前一规则,但遵循"n-ic")。如果在某个函数中给定一个单词你必须返回后缀连字符,你该如何表示这样的规则呢
解法一:
  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4.   
  5. void swap(char * tem_word, int length){     //将单词首尾反序  
  6.     int i, times = length / 2;  
  7.     char ch;  
  8.     for(i = 0; i < times; ++ i){  
  9.         ch = tem_word[i];  
  10.         tem_word[i] = tem_word[length - 1 - i];  
  11.         tem_word[length - 1 - i] = ch;  
  12.     }  
  13. }  
  14. bool func(char * word, char * dest, int length){    //dest为欲求的word的后缀的反序  
  15.     bool flag = false;  
  16.     char arr[24][10] = {    //最长的单词的长度是 9,但列数为10,原因main函数中最后一句话  
  17.         "ci-td" , "cit-si-al" , "cit-p" , "ci-tyl-" , "ci-to" , "cit-na" , "cit-n" , "cit-c" , "cit-ta" ,  
  18.         "ci-ta" , "cin-h" , "ci-n" , "ci-m" , "cil-l" , "cil-b" , "cilc-" , "ci-l" , "ci-h" , "ci-f" ,  
  19.         "ci-d" , "cib-" , "ci-a" , "cam-" , "ca-i"  
  20.     };  
  21.     char arr1[24][8] = {  
  22.         "citd" , "citsial" , "citp" , "cityl" , "cito" , "citna" , "citn" , "citc" , "citta" ,  
  23.         "cita" , "cinh" , "cin" , "ci-m" , "cill" , "cilb" , "cilc" , "cil" , "cih" , "cif" ,  
  24.         "cid" , "cib" , "cia" , "cam" , "cai"  
  25.     };  
  26.     char * temp_str = new char[length + 1];  
  27.     strcpy(temp_str, word);  
  28.     swap(temp_str, length);
  29.     int i, len, j;  
  30.     for(i = 0; i < 24; ++ i){  
  31.         len = strlen(arr1[i]);  
  32.         if(len > length)  
  33.             continue;  
  34.         else{  
  35.             char * bk_str = new char[len + 1];  
  36.             for(j = 0; j < len; ++ j){  
  37.                 bk_str[j] = temp_str[j];  
  38.             }  
  39.             bk_str[j] = '\0' 
  40.             if(strcmp(bk_str, arr1[i]) == 0){  
  41.                 strcpy(dest, arr[i]);  
  42.                 flag = true;  
  43.                 break;  
  44.             }else  
  45.                 continue;             
  46.         }  
  47.     }  
  48.     delete temp_str;  
  49.     return flag;  
  50. }  
  51.   
  52.   
  53. int main(){  
  54.     char * word = new char[20];  
  55.     char * dest = new char[20];;  
  56.     cin >> word;  
  57.     if(func(word, dest, strlen(word))){ //如果为真说明找到  
  58.         swap(dest,strlen(dest));  
  59.         cout << dest << endl;  
  60.     }else{  
  61.         cout << "Cannot find the bk_str ! " << endl;  
  62.     }  
  63.     delete word;  
  64.     delete dest;   
  65.     return 0;  
  66. }  
  67. //result:  
  68. //clinic  
  69. // n-ic  
  70. //   
  71. //ethnic  
  72. // h-nic  

解法二:思路是:hash表中带hash。第一个以ic,tic等做hash。首先根据后缀找到hash_set,再把余下的字段,依次在hash_set中查找,并取出最长的。
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<string>  
  4. #include<iterator>  
  5. #include<iostream>  
  6. #include<algorithm>  
  7. #include<hash_map>  
  8. #include<hash_set>  
  9.   
  10. usingnamespace std;   
  11. usingnamespace stdext;   
  12.   
  13. char *p[] = {"et-ic","al-is-tic","s-tic","p-tic","-lyt-ic","ot-ic","an-tic",  
  14. "n-tic","c-tic","at-ic","h-nic","n-ic","m-ic","l-lic","b-lic","-clic","l-ic",  
  15. "h-ic","f-ic","d-ic","-bic","a-ic","-mac","i-ac"};  
  16.   
  17.   
  18. void build_map(hash_map<string, hash_set<string> >& dict)   
  19. {  
  20. constint n = sizeof(p)/sizeof(char *);   
  21. for (int i = 0; i < n; ++i)   
  22. {  
  23. string line = p[i]; reverse(line.begin(), line.end());  
  24. int pos = line.find('-');  
  25. dict[line.substr(0, pos)].insert(line.substr(pos + 1, line.length() - pos - 1));   
  26. }  
  27. }  
  28.   
  29. string lookup(hash_map<string, hash_set<string> >& dict, string word)   
  30. {  
  31. string line = word; reverse(line.begin(), line.end());  
  32. int pos = line.find('-');  
  33. string ret;  
  34.   
  35. hash_map<string, hash_set<string> >::iterator iter;  
  36. if (dict.end() != (iter = dict.find(line.substr(0, pos))))   
  37. {  
  38. hash_set<string> &h = iter->second;  
  39. string temp = line.substr(pos + 1, line.length() - pos - 1);   
  40. for (int j = 1; j <= temp.length(); ++j)   
  41. {  
  42. string c = temp.substr(0, j);  
  43. if (h.find(c) != h.end() && c.length() > ret.length())   
  44. ret = c;  
  45. }  
  46. }  
  47. ret = iter->first +"-" + ret;  
  48. reverse(ret.begin(), ret.end());  
  49. return ret;   
  50. }  
  51. int main(void)  
  52. {  
  53. string sline;  
  54. hash_map<string, hash_set<string> > dict;  
  55. build_map(dict);  
  56.   
  57. while (cin >> sline)   
  58. {  
  59. cout << lookup(dict, sline) << endl;  
  60. }  
  61. return 0;   
  62. }  
有什么好的解法可以互相探讨,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程珠玑第三章习题5——英语中的连字符问题 的相关文章

  • Kettle循环获取结果集

    文章目录 1 Kettle循环获取结果集 1 1 效果图 1 2 转换介绍 1 3 job介绍 1 4 运行job结果 2 关于Kettle中JavaScrpit的使用 1 Kettle循环获取结果集 1 1 效果图 job j1 kjb

随机推荐

  • 黑马jvm课程笔记d1

    目录 一 堆内存相关 1 1 定义 1 2堆内存溢出 1 2 1 堆内存内存诊断工具 二 方法区相关 2 1 方法区组成 2 2 方法区内存溢出 2 3 方法区内常量池 2 4 运行时常量池 三 StringTable相关 3 1 Stri
  • [1136]Linux中date时间和hwclock时间不一致

    文章目录 1 在同步时间前需要先检查时区是否是china的CTS时区 2 操作系统有两个时间 软件时间和硬件时间 1 在同步时间前需要先检查时区是否是china的CTS时区 必须确保时区准确 否则时间同步后显示不正常 2 如果时区不正确 如
  • 【车联网原型系统|一】项目介绍+需求分析+概要设计

    物联网原型系统导航 车联网原型系统 一 项目介绍 需求分析 概要设计 https blog csdn net weixin 46291251 article details 125807297 车联网原型系统 二 数据库 应用层协议设计 h
  • 前端安全性问题以及防御措施

    整理一下前端开发过程中经常遇到的安全问题 1 xss跨站脚本攻击原理 如何进行 防御手段 如何进行 XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点 进而添加一些代码 嵌入到web页面中去 使别的用户访问都会执行
  • Python多线程 Threading

    1 介绍 多线程是加速程序计算的有效方式 Python的多线程模块threading上手快速简单 从这节开始我们就教大家如何使用它 2 添加线程 本节我们来学习threading模块的一些基本操作 如获取线程数 添加线程等 首先别忘了导入模
  • Nova: 2 Nova源码以及服务路径

    目标 1 弄清楚nova组件通过packstack安装后源码位置 2 确定nova组件服务启动路径 3 确定nova组件配置文件路径 0 whereis nova root localhost www whereis nova nova u
  • 怎么往钉钉群里发文件_钉钉授课教程

    一 课前直播准备 建立钉钉班级群 如果学校已经开通了钉钉 家校通讯录 那么老师只要进入自己所在的钉钉班级群看看还有哪些学生未加入 也可多邀请学生家长捆绑到学生上 以备妈妈的手机不能用 还可以用爸爸的 如果自己的学校还没有开通钉钉 家校通讯录
  • Linux软件包安装(rpm、yum、apt-get)

    http m blog csdn net suixin788 article details 52555558 Linux的发行版之间的联系和区别 http m blog csdn net wanghui499917270 article
  • 互斥和同步-读者/写者问题

    读者 写者问题 问题定义 存在一个多进程共享的数据区 该数据区可以是 一个文件或者一块内存或者一组寄存器 有些进程reader只读取该数据区中的数据 有些进程writer只往数据区写数据 满足条件 任意数量的读进程可以同时读该文件 一次只有
  • [LeetCode]235 二叉查找树的最近公共父亲节点

    Lowest Common Ancestor of a Binary Search Tree 二叉查找树的最近公共父亲节点 难度 Easy Given a binary search tree BST find the lowest com
  • 解决项目中出现问题 Cannot resolve com.xpand:starter-canal:0.0.1-SNAPSHOT

    解决方案 https www cnblogs com dalianpai p 14010753 html 亲测有效 编译通过 第一步 前往https github com chenqian56131 spring boot starter
  • Homebrew 更换国内源

    eval opt homebrew bin brew shellenv export HOMEBREW BREW GIT REMOTE https mirrors ustc edu cn brew git export HOMEBREW C
  • 【Spring】Feign客户端发送HTTPS请求绕过认证

    1 概述 转载 https www jianshu com p ea627708ab52 一个Spring Boot项目 为了使用Harbor仓库 起初通过Spring RestTemplate完成了对Harbor仓库的HTTPS请求 后想
  • 编程调节Win7/Win8系统音量的一种方法

    include
  • Cheat Engine使用教程

    系列文章目录 文章目录 系列文章目录 前言 一 解决办法 二 使用步骤 1 下载Cheat Engine 2 设置 前言 计算机硬盘不够用 但里面很多文件也舍不得删除 只有靠百度网盘来撑撑大小了 所以省吃俭用购买了百度会员 心疼每个月好几十
  • MPI_Bcast函数的用法

    程序功能 MPI Bcast函数用法 作成日期 2016 12 14 详细说明 include
  • AltiumDesigner如何绘制PCB封装

    AltiumDesigner如何绘制PCB封装 一 为什么要自己画PCB封装 当我们需要用的一些元器件PCB封装库中找不到的时候 我们就需要自己手动绘制一些元器件的PCB封装 当然也可以选择用相似的代替 但是在一些长场合中并不允许我们这样做
  • openwrt编译问题记录

    目录 1 git clone 速度太慢甚至断开连接 2 编译openwrt镜像make时发生错误 3 scripts feeds install a 时出现警告 1 git clone 速度太慢甚至断开连接 解决办法 在clone时将git
  • 如何显示文件后缀

    一 如何显示文件后缀 1 首先打开电脑上的本地磁盘D 2 然后点击组织 3 在弹出的窗口中点击文件夹和搜索 4 在弹出的窗口在点击查看 5 下拉滚动条 6 最后取消勾选隐藏已知文件类型的扩展名
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i