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"]
.
思路: 1 先按word break 走一遍, 做好标记。
2. 再按DFS 走一遍,把word 都添加进list.
易错点: dfs 中 只用循环长度就行。 StringBuilder 最后添加时候 别忘记 sb.toString().trim(). 还有就是每次添加完单词, DFS 后要删除最后一个单词。
sb.delete(s.length() - cur.length() - 1, s.length())
public class Solution {
public List<String> wordBreak(String s, Set<String> dict) {
int len = s.length();
boolean[][] isSeg = new boolean[len][len + 1];
for(int j = 1; j <= len; j++){
for(int i = 0; i + j <= len; i++){
String cur = s.substring(i, i+j);
if(dict.contains(cur)){
isSeg[i][j] = true;
}else{
for(int k = 1; k < j; k++){
if(isSeg[i][k] && isSeg[i+k][j-k]){
isSeg[i][j] = true;
break;
}
}
}
}
}
List<String> ret = new ArrayList<String>();
if(!isSeg[0][len]){
return ret;
}
dfs(s, 0, "", isSeg, dict, ret);
return ret;
}
private void dfs(String s, int start, String sol, boolean[][] isSeg, Set<String> dict, List<String> ret){
if(start >= s.length()){
ret.add(sol.trim());
return;
}
for(int i = start + 1; i <= s.length(); i++){//--从 start + 1 开始, 因为 要截取 i -- start 的 作为子串
if(isSeg[start][i - start]){
String cur = s.substring(start, i);
if(dict.contains(cur)){
dfs(s, i, sol + cur + " ", isSeg, dict, ret);// 用 String 的好处
}
/*
if(dict.contains(cur)){<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">// 和 String Builder 一样的用法,更为直观</span>
sol = sol + cur + " ";
dfs(s, i, sol, isSeg, dict, ret);
sol = sol.substring(0, sol.length() - cur.length() - 1);
}
*/
}
}
}
}