隐藏页面特效

leetcode 140单词拆分Ⅱ

原想法:通过遍历找出每个位点可能出现的单词的列表,然后通过dfs遍历找出所有的组合,有点类似于之前刷pat时用的dijstra+dfs,代码如下

class Solution { List<String>[]startWordList; List<String>words=new ArrayList<>(); List<String>result=new ArrayList<>(); public void dfs(int cursor,int length){ if(cursor>length){ return; }else if(cursor==length){//这种情况即找到了结果 String res=""; for(int i=0;i<words.size();i++){ if(i==0){ res=res+words.get(i); }else { res=res+" "+words.get(i); } } result.add(res); return; } for(String word:startWordList[cursor]){ words.add(word); dfs(cursor+word.length(),length); words.remove(words.size()-1); } } public List<String> wordBreak(String s, List<String> wordDict) { startWordList=new List[s.length()]; for(int i=0;i<startWordList.length;i++){ startWordList[i]=new ArrayList<>(); } //先通过循环搜索出所有开始点可能出现的单词 for(int i=0;i<s.length();i++){ for(int j=i;j<=s.length();j++){ String sub=s.substring(i,j); for(String word:wordDict){ if(word.equals(sub)){ startWordList[i].add(word); } } } } dfs(0,s.length()); return result; } }

全是a的那个点运行超时了。

优化:记忆化搜索

标注不能达到终点的点,当每一次搜索结束后返回true or false,发现某个点不可达后将其哈希表中对应项标注,此后回溯后再次经过此点时则直接跳过。代码如下:

​```class Solution { List<String>[]startWordList; List<String>words=new ArrayList<>(); List<String>result=new ArrayList<>(); boolean[]cantAchieve;//记录某个点是否能达到终点 public boolean dfs(int cursor,int length){ if(cursor>length){ return false; }else if(cursor==length){//这种情况即找到了结果 String res=""; for(int i=0;i<words.size();i++){ if(i==0){ res=res+words.get(i); }else { res=res+" "+words.get(i); } } result.add(res); return true; } if (cantAchieve[cursor]==false) { boolean find=false; for(String word:startWordList[cursor]){ words.add(word); boolean ok=dfs(cursor+word.length(),length); words.remove(words.size()-1); if(ok==true){ find=ok; } } if(find==false){ cantAchieve[cursor]=true; } return find; }else{ return false; } } public List<String> wordBreak(String s, List<String> wordDict) { startWordList=new List[s.length()]; cantAchieve=new boolean[s.length()]; for(int i=0;i<startWordList.length;i++){ startWordList[i]=new ArrayList<>(); } //先通过循环搜索出所有开始点可能出现的单词 for(int i=0;i<s.length();i++){ for(int j=i;j<=s.length();j++){ String sub=s.substring(i,j); for(String word:wordDict){ if(word.equals(sub)){ startWordList[i].add(word); } } } } dfs(0,s.length()); return result; } }

__EOF__

本文作者秋雨清笛
本文链接https://www.cnblogs.com/PanYuDi/p/14090750.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   秋雨清笛  阅读(48)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示