careercup-高等难度 18.7
18.7 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
解法:
原题
给定字符串,以及一个字典,判断字符串是否能够拆分为字段中的单词。例如,字段为{hello,world},字符串为hellohelloworld,则可以拆分为hello,hello,world,都是字典中的单词。
这个题目唤作“分词问题”,略显宽泛。只是想提及这个问题,这是在自然语言处理,搜索引擎等等领域中,非常基础的一个问题,解决的方法也比较多,相对比较成熟,不过这仍旧是一个值得进一步探索的问题。那我们先从这个简单的题目入手,看看如何处理题目中这个问题。 最直接的思路就是递归,很简单。我们考虑每一个前缀,是否在字典中?如果在,则递归处理剩下的字串,如果不在;则考虑其他前缀。示例代码如下:
递归的方法实现:
但是这样会有很多重复的查找:
这个题目的处理,上期的题目是很相似的。在递归子问题中,找重复的子问题。也非常明显,如下图(图片来自GeeksforGeeks)所示:
如果使用动态规划的方法:
bool wordBreak(string s, unordered_set<string> &dict) { if(dict.empty()||s.empty()) return false; unordered_map<string,bool> mp; auto iter=dict.begin(); while(iter!=dict.end()) { mp[*iter]=true; iter++; } return canBuildWord(s,mp); } bool canBuildWord(string s,unordered_map<string,bool> &mp) { if(mp.find(s)!=mp.end()) return mp[s]; for(int i=1;i<=s.length();i++) { string left=s.substr(0,i); string right=s.substr(i); if(mp.find(left)!=mp.end()&&mp[left]==true&&canBuildWord(right,mp)) return true; } mp[s]=false; return false; }
其中使用动态规划的方法缓存了多次调用之间的结果。如果该字符串在map中没有找到,那么将该字符串插入到map中,并将其值置为false,如果下次还是查找该字符串且该字符串在map中,并且值为false,则可以直接返回其在map中存放的值。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深度机器学习未来将怎样改变人类生活
摘要: 三年前,在山景城(加利福尼亚州)秘密的谷歌X实验室里,研究者从YouTube视频中选取了大约一千万张静态图片,并且导入到Google Brain —— 一个由1000台电脑组成的像幼儿大脑一样的神经网络。花费了三天时间寻找模式 ... 三年前,在山景城(加利福尼亚州)秘密的谷歌X实验室里,研究者从YouTube视频中选取了大约一千万张静态图片,并且导入到Google Brain —— 一个由1000台电脑组成的像幼儿大脑一样的神经网络。花费了三天时间寻找模式之后,Google Brain 能够只靠自己就能区分出某些特定的分类:人脸,身体,还有——猫! Google Brain发现,互联网上充斥着猫的照片,这个发现让人感到很有趣。但这也是深度学习复兴中的里程碑:一门发展三十余年,拥有大量数据及处理能力的技术,帮助计算机解决一些人们可以直观解决的繁琐的问题,小至人脸识别,大到语言理解。 深度学习使计算机中的神经网络重新焕发生机,这一直是计算机领域的古老想法。这些系统,零星的被脑中密集的联通神经细胞所影响,在实验的基础上,通过调整神经元直接连接的参数来模仿人类学习的过程。Google...
- 下一篇
机器视觉项目基础框架
机器视觉项目基础框架 【注意,这个框架已经过时,最新的内容请查看gomfctemplate】 一、背景 虽然OPENCV是可以在多平台下面运行,并且通过封包(DLL)的形式,可以被多种程序所调用,但是在windows平台下面,OPENCV和MFC程序一起使用还是最常见,也是功能最强大的。这里搭建基础的MFC+OPENCV框架,为在此之上进行机器视觉设计奠定基础。在实现的过程中,有许多选择是由于自己的偏好和习惯,请辩证分析。 二、MFC部分具体设计实现 1)创建MFC对话框程序 2)添加并且设计menu,挂在主窗体上 3)添加tab并且编写内容,创建对应成员变量,在initdialog中添加相关内容 新创建对话框资源, style为 child,Border为None,适当大小。双击窗体,创建对应的类 并且添加到类和initdialog中去 并且编写触发响应代码 三、结合OPENCV 到此为止,得到的是一个带有菜单和tab的mfc基础框架,这种框架用来做机器视觉是比较方便的。下面要做的就是mfc程序如何和ope...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器