leetcode 139. Word Break

来源:互联网 发布:淘宝开店品牌怎么填 编辑:程序博客网 时间:2024/06/06 05:18

这题目,我用了下回溯,果然超时了。。最近忙实习

等我有空。。我来试一下动态规划

下面是超时代码

public class Solution {    public boolean wordBreak(String s, List<String> wordDict) {        Set<String> set=new HashSet<>();        for(int i=0;i<wordDict.size();i++){            set.add(wordDict.get(i));        }        if(s.length()==0)return true;        for(int i=0;i<s.length();i++){            if(set.contains(s.substring(0,i+1))){                String newstring="";                if(i+1<s.length()){                    newstring=s.substring(i+1,s.length());                }                help(newstring,set);            }        }        return mark;    }    boolean mark=false;    private void help(String s,Set<String> set){        if(s.length()==0){            mark=true;            return ;        }        for(int i=0;i<s.length();i++){            if(set.contains(s.substring(0,i+1))){                String newstring="";                if(i+1<s.length()){                    newstring=s.substring(i+1,s.length());                }                help(newstring,set);            }        }    }}
嗯花了点时间想了下,对代码进行了如下修改。。现在算法复杂度降为O(s.length()*wordDict.size()),但是依然通不过。。
public class Solution {    public boolean wordBreak(String s, List<String> wordDict) {        Set<String> set=new HashSet<>();        for(int i=0;i<wordDict.size();i++){            set.add(wordDict.get(i));        }        if(s.length()==0)return true;        LinkedList<String> list=new LinkedList<>();        for(int i=0;i<s.length();i++){            if(set.contains(s.substring(0,i+1))){                list.add(s.substring(0,i+1));            }else {                int len=list.size();                for(int j=0;j<len;j++){                    String str=list.get(j);                    if(set.contains(s.substring(str.length(),i+1))){                        list.add(s.substring(0,i+1));                    }                }            }        }        for(int i=0;i<list.size();i++){            if(list.get(i).equals(s))return true;        }        return false;    }}

恩上面这个想法还是有点问题,并不是O(n*m)修改后的accept方法。。

说实话逻辑还是蛮复杂的

public class Solution {    public boolean wordBreak(String s, List<String> wordDict) {        Set<String> set=new HashSet<>();        for(int i=0;i<wordDict.size();i++){            set.add(wordDict.get(i));        }        if(s.length()==0)return true;        Set<String> newset=new HashSet<>();        for(int i=0;i<s.length();i++){            if(set.contains(s.substring(0,i+1))){                newset.add(s.substring(0,i+1));                continue;            }else {                for(int j=0;j<wordDict.size();j++){                    if(wordDict.get(j).length()<=i){                        String str=s.substring(i-wordDict.get(j).length()+1,i+1);                        if(set.contains(str)){                            if(newset.contains(s.substring(0,i+1-wordDict.get(j).length()))&&!newset.contains(s.substring(0,i+1)))                            newset.add(s.substring(0,i+1));                        }                    }                }            }        }        if(newset.contains(s)){           return true;        }        return false;    }}


0 0
原创粉丝点击