Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given s = "leetcode", dict = ["leet", "code"].
Return true because "leetcode" can be segmented as "leet code".
这道题是说我们给一个string,然后你可以以各种方式拆分,然后去dict字典里面找能不能用里面的单词把这个string拼起来。
这道题目的关键在于要想重复一遍一遍检测,除了“遍历”,最好用的还是“递归”。
首先,给出一种我自己认为最好用,直观的方法:
public class BreakWord {
public boolean wordBreak(String s, Set dict) {
return wordBreakHelper(s, dict, 0);
}
public boolean wordBreakHelper(String s, Set dict, int start){
if(start==s.length())return true;
for(String str:dict){
int len=str.length();
int end = start+len;
if(end>s.length())continue;
if(s.substring(start,end).equals(str))
if(wordBreakHelper(s,dict,end))
return true;
}
return false;
}
}
但是相信细心的朋友也发现了,这个方法的复杂度是O(n^2),所以如果你在Leetcode上面跑,当给一个“aaaaaaaaaaaaaaaaaaaaaaaaaaaab”的例子时,会timeexceedlimted……
so怎么办呢??
这里提供另一个O(string length * dict size)的方法:
public class Solution {
public boolean wordBreak(String s, Set dict) {
boolean[] t = new boolean[s.length()+1];//因为最后你要返回的时t[s.length()]
t[0] = true; //想想为啥?
for(int i=0; i
//这个地方最关键,一定从true的地方接着开始在dict里找
if(!t[i])
continue;
for(String a: dict){
int len = a.length();
int end = i + len;
if(end > s.length())
continue;
if(t[end]) continue;
if(s.substring(i, end).equals(a)){
t[end] = true;
}
}
}
return t[s.length()];
}
}这个方法在于没有用递归,而是直接用一个boolean数组存了在各个位置的判断,这样直接判断到最后一个boolean就好了。