1.
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”.
public boolean wordBreak(String s, Set<String> dict) {
if(s==null||s.length()==0) return true;
boolean[] res=new boolean[s.length()+1];
res[0]=true;
for(int i=1;i<=s.length();i++){
for(int j=0;j<i;j++){
if(res[j]&&dict.contains(s.substring(j,i))){
res[i]=true;
break;
}
}
}
return res[s.length()];
}
总的时间复杂度是O(n^2)(i的累加仍然是n^2量级),而空间复杂度则是字符串的数量,即O(n)
2.
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s =”catsanddog”,
dict =[“cat”, “cats”, “and”, “sand”, “dog”].
A solution is[“cats and dog”, “cat sand dog”].
前向切分:
public class l140_word_break2 {
ArrayList<String> res=new ArrayList<>();
public ArrayList<String> wordBreak(String s, Set<String> dict) {
if(s==null||s.length()==0) return null;
boolean[] dp=new boolean[s.length()+1];
help(s,dict,res,"",0,dp);
return res;
}
void help(String s,Set<String> dict,ArrayList<String> res,String string,int start,boolean[] dp){
for (int i=start+1;i<=s.length();i++){
String tmp=string;
if(dict.contains(s.substring(start,i))){
//分割点到了最后,string遍历结束,将切分结果tmp存入res
if(i==s.length()){
tmp+=s.substring(start,i);
res.add(tmp);
}
else {
if(!(dp[start])){
int size=res.size();
tmp+=s.substring(start,i)+" ";
help(s,dict,res,tmp,i,dp);
if(size==res.size())
dp[i]=true;
}
}
}
}
}
牛客网上对输出顺序有要求,采用后向切分
void help(String s,Set<String> dict,ArrayList<String> res,String string,int start,boolean[] dp){
for (int j=start-1;j>=0;j--){
String tmp=string;
if(dict.contains(s.substring(j,start))){
if(j==0){
tmp=s.substring(j,start)+" "+tmp;
res.add(tmp.trim());
}
else {
if(!(dp[j])){
int size=res.size();
tmp=s.substring(j,start)+" "+tmp;
help(s,dict,res,tmp,j,dp);
if(size==res.size())
dp[j]=true;
}
}
}
}
}