游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

LeetCode力扣官方题解472。连接词

  题目描述
  给你一个不含重复单词的字符串数组words,请你找出并返回words中的所有连接词。
  连接词定义为:一个完全由给定数组中的至少两个较短单词组成的字符串。
  示例1:输入:words〔cat,cats,catsdogcats,dog,dogcatsdog,hippopotamuses,rat,ratcatdogcat〕输出:〔catsdogcats,dogcatsdog,ratcatdogcat〕解释:catsdogcats由cats,dog和cats组成;dogcatsdog由dog,cats和dog组成;ratcatdogcat由rat,cat,dog和cat组成。
  示例2:输入:words〔cat,dog,catdog〕输出:〔catdog〕
  提示:1words。length100words〔i〕。length1000words〔i〕仅由小写字母组成0sum(words〔i〕。length)10
  解决方案
  前言
  本文的解法需要使用字典树。如果读者对字典树不了解,建议首先阅读208。实现Trie(前缀树)的官方题解,在理解字典树的实现之后继续阅读本文。
  方法一:字典树记忆化搜索
  思路与算法
  判断一个单词是不是连接词,需要判断这个单词是否完全由至少两个给定数组中的更短的非空单词(可以重复)组成。判断更短的单词是否在给定数组中,可以使用字典树实现。
  为了方便处理,首先将数组words按照字符串的长度递增的顺序排序,排序后可以确保当遍历到任意单词时,比该单词短的单词一定都已经遍历过,因此可以根据已经遍历过的全部单词判断当前单词是不是连接词。
  在将数组words排序之后,遍历数组,跳过空字符串,对于每个非空单词,判断该单词是不是连接词,如果是连接词则将该单词加入结果数组,如果不是连接词则将该单词加入字典树。
  判断一个单词是不是连接词的做法是在字典树中搜索。从该单词的第一个字符(即下标0处的字符)开始,在字典树中依次搜索每个字符对应的结点,可能有以下几种情况:如果一个字符对应的结点是单词的结尾,则找到了一个更短的单词,从该字符的后一个字符开始搜索下一个更短的单词;如果一个字符对应的结点在字典树中不存在,则当前的搜索结果失败,回到上一个单词的结尾继续搜索。
  如果找到一个更短的单词且这个更短的单词的最后一个字符是当前单词的最后一个字符,则当前单词是连接词。由于数组words中没有重复的单词,因此在判断一个单词是不是连接词时,该单词一定没有加入字典树,由此可以确保判断连接词的条件成立。
  由于一个连接词由多个更短的非空单词组成,如果存在一个较长的连接词的组成部分之一是一个较短的连接词,则一定可以将这个较短的连接词换成多个更短的非空单词,因此不需要将连接词加入字典树。
  为了降低时间复杂度,需要使用记忆化搜索。对于每个单词,创建与单词相同长度的数组记录该单词的每一个下标是否被访问过,然后进行记忆化搜索。搜索过程中,如果一个下标已经被访问过,则从该下标到末尾的部分一定不是由给定数组中的一个或多个非空单词组成(否则上次访问时已经可以知道当前单词是连接词),只有尚未访问过的下标才需要进行搜索。
  代码
  Python3classTrie:definit(self):self。children〔None〕26self。isEndFalsedefinsert(self,word:str):nodeselfforchinword:chord(ch)ord(a)ifnotnode。children〔ch〕:node。children〔ch〕Trie()nodenode。children〔ch〕node。isEndTruedefdfs(self,word:str,start:int,vis:List〔bool〕)bool:ifstartlen(word):returnTrueifvis〔start〕:returnFalsevis〔start〕Truenodeselfforiinrange(start,len(word)):nodenode。children〔ord(word〔i〕)ord(a)〕ifnodeisNone:returnFalseifnode。isEndandself。dfs(word,i1,vis):returnTruereturnFalseclassSolution:deffindAllConcatenatedWordsInADict(self,words:List〔str〕)List〔str〕:words。sort(keylen)ans〔〕rootTrie()forwordinwords:ifword:continueifroot。dfs(word,0,〔False〕len(word)):ans。append(word)else:root。insert(word)returnans
  CstructTrie{boolisEnd;vectorTriechildren;Trie(){thischildrenvectorTrie(26,nullptr);thisisEndfalse;}};classSolution{public:TrietrienewTrie();vectorstringfindAllConcatenatedWordsInADict(vectorstringwords){vectorstringans;sort(words。begin(),words。end(),〔〕(conststringa,conststringb){returna。size()b。size();});for(inti0;iwords。size();i){stringwordwords〔i〕;if(word。size()0){continue;}vectorintvisited(word。size(),0);if(dfs(word,0,visited)){ans。emplaceback(word);}else{insert(word);}}returnans;}booldfs(conststringword,intstart,vectorintvisited){if(word。size()start){returntrue;}if(visited〔start〕){returnfalse;}visited〔start〕true;Trienodetrie;for(intistart;iword。size();i){charchword〔i〕;intindexcha;nodenodechildren〔index〕;if(nodenullptr){returnfalse;}if(nodeisEnd){if(dfs(word,i1,visited)){returntrue;}}}returnfalse;}voidinsert(conststringword){Trienodetrie;for(inti0;iword。size();i){charchword〔i〕;intindexcha;if(nodechildren〔index〕nullptr){nodechildren〔index〕newTrie();}nodenodechildren〔index〕;}nodeisEndtrue;}};
  JavaclassSolution{TrietrienewTrie();publicListStringfindAllConcatenatedWordsInADict(String〔〕words){ListStringansnewArrayListString();Arrays。sort(words,(a,b)a。length()b。length());for(inti0;iwords。length;i){Stringwordwords〔i〕;if(word。length()0){continue;}boolean〔〕visitednewboolean〔word。length()〕;if(dfs(word,0,visited)){ans。add(word);}else{insert(word);}}returnans;}publicbooleandfs(Stringword,intstart,boolean〔〕visited){if(word。length()start){returntrue;}if(visited〔start〕){returnfalse;}visited〔start〕true;Trienodetrie;for(intistart;iword。length();i){charchword。charAt(i);intindexcha;nodenode。children〔index〕;if(nodenull){returnfalse;}if(node。isEnd){if(dfs(word,i1,visited)){returntrue;}}}returnfalse;}publicvoidinsert(Stringword){Trienodetrie;for(inti0;iword。length();i){charchword。charAt(i);intindexcha;if(node。children〔index〕null){node。children〔index〕newTrie();}nodenode。children〔index〕;}node。isEndtrue;}}classTrie{Trie〔〕children;booleanisEnd;publicTrie(){childrennewTrie〔26〕;isEndfalse;}}
  Golangtypetriestruct{children〔26〕trieisEndbool}func(roottrie)insert(wordstring){node:rootfor,ch:rangeword{chaifnode。children〔ch〕nil{node。children〔ch〕trie{}}nodenode。children〔ch〕}node。isEndtrue}func(roottrie)dfs(vis〔〕bool,wordstring)bool{ifword{returntrue}ifvis〔len(word)1〕{returnfalse}vis〔len(word)1〕truenode:rootfori,ch:rangeword{nodenode。children〔cha〕ifnodenil{returnfalse}ifnode。isEndroot。dfs(vis,word〔i1:〕){returntrue}}returnfalse}funcfindAllConcatenatedWordsInADict(words〔〕string)(ans〔〕string){sort。Slice(words,func(i,jint)bool{returnlen(words〔i〕)len(words〔j〕)})root:trie{}for,word:rangewords{ifword{continue}vis:make(〔〕bool,len(word))ifroot。dfs(vis,word){ansappend(ans,word)}else{root。insert(word)}}return}
  CpublicclassSolution{TrietrienewTrie();publicIListstringFindAllConcatenatedWordsInADict(string〔〕words){IListstringansnewListstring();Array。Sort(words,(a,b)a。Lengthb。Length);for(inti0;iwords。Length;i){stringwordwords〔i〕;if(word。Length0){continue;}bool〔〕visitednewbool〔word。Length〕;if(DFS(word,0,visited)){ans。Add(word);}else{Insert(word);}}returnans;}publicboolDFS(stringword,intstart,bool〔〕visited){if(word。Lengthstart){returntrue;}if(visited〔start〕){returnfalse;}visited〔start〕true;Trienodetrie;for(intistart;iword。Length;i){charchword〔i〕;intindexcha;nodenode。children〔index〕;if(nodenull){returnfalse;}if(node。isEnd){if(DFS(word,i1,visited)){returntrue;}}}returnfalse;}publicvoidInsert(stringword){Trienodetrie;for(inti0;iword。Length;i){charchword〔i〕;intindexcha;if(node。children〔index〕null){node。children〔index〕newTrie();}nodenode。children〔index〕;}node。isEndtrue;}}classTrie{publicTrie〔〕children;publicboolisEnd;publicTrie(){childrennewTrie〔26〕;isEndfalse;}}
  CtypedefstructTrie{structTriechildren〔26〕;boolisEnd;}Trie;defineTRIEINITIAL(node)do{for(inti0;i26;i){(node)children〔i〕NULL;}(node)isEndfalse;}while(0);staticvoidfreeTrie(Trienode){if(NULLnode){return;}for(inti0;i26;i){if(nodechildren〔i〕!NULL){freeTrie(nodechildren〔i〕);}}free(node);}staticintcmp(constvoidpa,constvoidpb){intlastrlen((char)pa);intlbstrlen((char)pb);returnlalb;}booldfs(Trietrie,constcharword,intwordSize,intstart,intvisited){if(wordSizestart){returntrue;}if(visited〔start〕){returnfalse;}visited〔start〕1;Trienodetrie;for(intistart;iwordSize;i){charchword〔i〕;intindexcha;nodenodechildren〔index〕;if(nodeNULL){returnfalse;}if(nodeisEnd){if(dfs(trie,word,wordSize,i1,visited)){returntrue;}}}returnfalse;}voidinsert(Trietrie,constcharword,intwordSize){Trienodetrie;for(inti0;iwordSize;i){charchword〔i〕;intindexcha;if(nodechildren〔index〕NULL){nodechildren〔index〕(Trie)malloc(sizeof(Trie));TRIEINITIAL(nodechildren〔index〕);}nodenodechildren〔index〕;}nodeisEndtrue;}charfindAllConcatenatedWordsInADict(charwords,intwordsSize,intreturnSize){intpos0;charans(char)malloc(sizeof(char)wordsSize);Trietrie(Trie)malloc(sizeof(Trie));TRIEINITIAL(trie);qsort(words,wordsSize,sizeof(char),cmp);for(inti0;iwordsSize;i){intlenstrlen(words〔i〕);if(len0){continue;}intvisited(int)malloc(sizeof(int)len);memset(visited,0,sizeof(int)len);if(dfs(trie,words〔i〕,len,0,visited)){ans〔pos〕(char)malloc(sizeof(char)(len1));strncpy(ans〔pos〕,words〔i〕,len);ans〔pos〕〔len〕;pos;}else{insert(trie,words〔i〕,len);}free(visited);}freeTrie(trie);returnSizepos;returnans;}
  复杂度分析时间复杂度:
  其中n是数组words的长度,li是单词words〔i〕的长度。对数组words按照字符串的长度递增的顺序排序需要O(nlogn)的时间,判断单词words〔i〕是不是连接词的时间复杂度是O(li)。空间复杂度:
  其中n是数组words的长度,li是单词words〔i〕的长度,S是字符集,这道题中S为全部小写英语字母,S26。空间复杂度主要取决于字典树,最坏情况下需要将所有的单词加入字典树。
  BY
  本文作者:力扣
  声明:本文归力扣版权所有,如需转载请联系。

为什么有人喜欢把声音外放,还开很大声一乘客在公共场合刷着视频,声音小一点,好吗?轻轨上的乘客小声的提醒着,被提醒的乘客连连道歉,并关闭了声音。刚上大学的时候,和朋友坐地铁,突然想到一个有意思的视……世界杯让中东航空业集体腾飞世界杯正在如火如荼的举办,来自全世界的球迷正向卡塔尔涌入,卡塔尔为了这次世界杯的举办筹备超过10年之久,这为卡塔尔经济的腾飞做了一次非常好的宣传。作为以第三产业的航空业,……16w落地的合资SUV,城市代步用,有没有好的推荐?16万落地,合资,城市代步用。首先排除日系、美系和德系紧凑型SUV,剩下能考虑的只有韩系车和法系车了。(这个预算不建议买小型SUV)先说价格,16万落地,意味着裸车价格在……你打篮球受过最严重的伤是什么?想过放弃吗?您好,我很高兴受到邀请来回答您这一个问题,我是钧哥,一个忠实的体育爱好者,喜欢我可以关注一下。篮球作为一项极具充满魅力的体育项目,很多人对篮球的痴迷程度是无法想象的,爱到……把大头虾放锅里焖一焖,出锅瞬间变美食,新手也能轻松搞定,真香今日份美味是蒜蓉焖大虾,主要食材选择的是淡水虾王罗氏虾。罗氏虾又称马拉西亚大虾,大头虾等,是一种大型淡水经济虾类,其壳薄体肥,肉质鲜嫩,味道鲜美,营养丰富,除富有一般淡水……最新报告超四成中国金融科技企业已经或计划境外展业北京日报客户端记者赵语涵2022年中国国际服务贸易交易会期间,毕马威中国和中国互联网金融协会金融科技发展与研究专委会再度携手发布《2022中国金融科技企业首席洞察报告》。……2年前花58万元买的蔚来ES8,如今电池性能有何变化?蔚来汽车是新兴的高端国内自主品牌,商务质感很强,就从目前蔚来ES8的价格来看,这款车在很多人心中都是高不可攀的豪华车,因为绝大多数人都会选择BBA,这或许成为了主流,谁叫BBA……十来万的雷凌不香嘛?到底值不值得购买?作为丰田旗下的一款家用型轿车,无论是耐用性和经济性,雷凌都是深受大众喜爱的,月均销量2万多销量排名仅次于丰田的卡罗拉,为什么雷凌销量这么好呢?为什么都说买了雷凌不后悔呢?下面我……神似华为mate40的鼎桥m40究竟是何方神圣?近期发布的一款新机鼎桥TDTechm40进入大家的视野,被网友们戏称为mate40亲儿子,那么这个从未听说过的品牌鼎桥到底是何方神圣?而其为什么可以几乎照搬华为mate40呢?……老年电动代步小车何去何从?还有6个月,老年代步车就将成为历史了!给很多老年人带来方便的老年代步车,同时也成为了马路杀手。根据公安部的数据显示,近五年来,因老年代步车引发的交通事故高达83万起,其中……你学车时遇到过哪些潜规则?现在的驾校都非常正规,管理也很严格,谈不到什么潜规则的问题,如果有,也是学员自己的想法有问题。我本来就不喜欢开车,前段时间父母非让我买车,说出门太不方便,有一个自己家的司……想换车,纠结奔驰GLC300和沃尔沃XC90,选哪个?强烈建议沃尔沃XC90!空间、动力、安全性都优于GLC,特别是GLC无自适应巡航,悬挂过硬,不适合长距离自驾游,而XC90正好相反!推荐沃尔沃XC90,不用纠结!你选的这……
75寸智能电视不到三千!如此高的性价比,面对投影仪依旧不再受今年春节回家,我看着陈旧的55英寸三星电视,觉得确实是该升级一下了。思来想去既然现在投影仪发展这么快,不如就买个高端旗舰款也好给家里体验超大屏。不过向来负责家中大小家电的父亲却……雪弗兰有的是黄标有的是蓝标有的是黑色的,有什么区别?壹车热评,原创不易,谢绝搬运!如果说车标是阻碍消费者购买某个品牌车型的因素之一的话,壹车热评觉得有两个品牌肯定应该上榜。一个是我们耳熟能详的国产品牌比亚迪(BYD),而另……华为5G旗舰现货,麒麟9000鸿蒙系统,用到华为王者归来我们都知道,华为Mate系列是华为手机中的高端代表,但由于制裁的影响,现在华为手机业务受到了很大影响,本来一年是两款旗舰的节奏,今年只更新了P系列,而且只有4G版本。这就导致华……沃尔沃XC60怎么开才最省油?省不了油,全系都是真材实料,自重1。9吨。什么概念?类似这样的家用城市suv,以本田crv为例。基本都是1。5吨上下,相差0。4吨,八百斤相当于130斤的成人六个人,也就……迈腾330和380市区油耗能差多少?我是19款330豪华版已提车三个月,目前市区综合7。9,长途高速5。5,特别说明:我开车比较猛不是很温柔那种,这也是我最终选择迈腾的原因,我上一辆丰田卡罗拉开了八年,以上属个人……陈戌源昔日强推新政腰斩,中超仅15队获提名,好大喜功终成大输众所周知,中国足协此前公布了一份清理欠薪完毕的球队名单,对于新赛季的中超18支球队来说,仅仅只有15支球队获得了提名。换句简单的话来说,在这份名单上面的15支球队,大概率是能够……探访西安浐灞国家湿地公园追鸟人穿着平底鞋,脖子上挂着望远镜,手上端着相机,这是李赟工作的标配。初见时,她正和同事在水边的斜坡上,聚精会神地观察着水面上的水鸟。每种鸟都有自己的个性。李赟压低声音说道。伴随着相……鲁大师发布UI系统流畅榜小米第四,荣耀第九,谁是冠军?跑分软件鲁大师发布2022年第三季度手机报告,其中系统UI排行引发热议,小米MIUI13只拿到第四名,荣耀MagicUI6位列倒数第二,与大家的印象并不相符,这个排行你敢相信吗……你会建议五十岁的父亲去学驾照吗?会的,怎么不会呢?去年我刚过60的时候,两个儿子、侄子还有儿媳妇四人同时去学开车,当时儿子就说爸,你也跟着一起去学吧,将来用得着的,费用不用担心。当时我不是没有信心,只是认为自……请特斯拉车主讲讲刹车,是一个踏板,踩下是加油,抬起是刹车吗?这事还需要特斯拉撤除来讲吗?动能回收,踩下油门是加速,松开油门是匀速刹车,如果想骑刹车,左边还有刹车踏板。并不是有些人想象的那样,只有一个油门踏板。基本上所有驾驶都能回收……东莞确诊夫妻是因为到西安考驾照,东莞的驾照那么难考吗?我和你说个真事儿啊!我家大姨子嫁到南边了,广东省考驾照是不是最难的我不知道,反正比我们河北省难吧!其实说难可能也不太准确,一个地方一个规则,最起码河北有夜考但是没有高速考……孩子要换牙了,这份换牙时间顺序表收好昨天幼儿园放学,老师说孩子可能要换牙了,有颗下门牙松了,孩子也是一脸的无助。他前一天就说牙齿有点松,没想到第二天就松得这么厉害了,可能真的要换牙了。换牙时间表孩子还……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网