题目
算法面试题汇总 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台
https://leetcode-cn.com/leetbook/read/top-interview-questions/xa9v8i/
给定一个非空字符串 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"]
输出:
[]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions/xa9v8i/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解析
暴力破解,记忆化搜索
class Solution {
private:
//作为字典查询单词,用于存储单词
unordered_set<string> wordDictSet;
//用于存储答案
unordered_map<int, vector<string>> ans;
public:
vector<string> wordBreak(string s, vector<string>& wordDict) {
//存储单词
for(auto word:wordDict){
wordDictSet.insert(word);
}
//反向搜索
backtrack(s,0);
return ans[0];
}
void backtrack(string &s,int index){
//如果遍历过index的情况,结束递归
if(!ans.count(index)){
//判断字符末尾
if(index==s.size()){
ans[index]={""};
return ;
}
ans[index] = {};
/*
加入s.size()==10
index=5,i=10
str 为s从5开始的(10-5)=5个字符,即s[5:9]
*/
for(int i=index+1;i<=s.size();++i){
//循环获取子串
string str = s.substr(index,i-index);
//判断字串是否存在于字典中
if(wordDictSet.find(str)!=wordDictSet.end()){
//递归获取ans[i]的答案
backtrack(s,i);
//获取i的答案后,把当前字串str添加到各个答案首,即ans[index]的答案
for(auto succ:ans[i]){
ans[index].push_back(succ.empty()?str:str+" "+succ);
}
}
}
}
}
};