题目
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入:
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
输出:
[
"cats and dog",
"cat sand dog"
]
示例 2:
输入:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
输出:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
解释: 注意你可以重复使用字典中的单词。
示例 3:
输入:
s = "catsandog"
wordDict = ["cats", "dog", "sand", "and", "cat"]
输出:
[]
思路1
递归超时。
代码1
class Solution {
public List<String> wordBreak(String s, List<String> wordDict) {
List<List<Integer>> sum=new ArrayList<>();
List<Integer> wordsindex=new ArrayList<>();
for(int i=1;i<=s.length();i++){
if(!wordDict.contains(s.substring(0,i)) ){
continue;
}
wordsindex.add(i);
digui(wordsindex,sum,s,wordDict);
wordsindex.remove(wordsindex.size()-1);
}
List<String> res=new ArrayList<>();
for(int i=0;i<sum.size();i++){
List<Integer> l=sum.get(i);
String r="";
for(int j=0;j<l.size();j++){
if(j==0){
r+=s.substring(0,l.get(j));
}else{
r+=" "+s.substring(l.get(j-1),l.get(j));
}
}
res.add(r);
}
return res;
}
public void digui(List<Integer> wordsindex,List<List<Integer>> sum,String s,List<String> wordDict){
int beginindex=wordsindex.get(wordsindex.size()-1);
if(beginindex==s.length()){
sum.add(new ArrayList<>(wordsindex));
return ;
}
for(int i=beginindex+1;i<=s.length();i++){
if(!wordDict.contains(s.substring(beginindex,i)) ){
continue;
}
wordsindex.add(i);
digui(wordsindex,sum,s,wordDict);
wordsindex.remove(wordsindex.size()-1);
}
}
}
思路2
字符串切割后递归。使用Map。
代码2
class Solution {
private Map<String, List<String>> map = new HashMap<>();
public List<String> wordBreak(String s, List<String> wordDict) {
// 不用map超时,空间换时间
if (map.containsKey(s)) return map.get(s);
List<String> res=new ArrayList<>();
// 技巧,否则结果为null
if(s.length()==0){
res.add("");
return res;
}
// 切断s
for(String word: wordDict){
if(s.startsWith(word)){
List<String> ls=wordBreak(s.substring(word.length()),wordDict);
for(String l: ls){
res.add( ( (word+" "+l).trim() ) );
}
}
}
map.put(s, res);
return res;
}
}
关键
map空间换时间。
字符串切割递归更简便。