这题目,我用了下回溯,果然超时了。。最近忙实习
等我有空。。我来试一下动态规划
下面是超时代码
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;
}
}