给定一个字符串 s
和一个字符串字典 wordDict
,在字符串 s
中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。
注意:词典中的同一个单词可能在分段中被重复使用多次。
示例 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 <= s.length <= 20
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 10
s
和 wordDict[i]
仅有小写英文字母组成
wordDict
中所有字符串都 不同
C++
class Solution { public: vector<string> res; vector<string> wordBreak(string s, vector<string>& wordDict) { string path; dfs(s, wordDict, res, path); return res; } void dfs(string s, vector<string>& wordDict, vector<string>& res, string path){ if(s.empty()){ res.push_back(path); return; } set<string> st(wordDict.begin(), wordDict.end()); int n = s.size(); for(int L = 0; L < n + 1; L ++){ if(st.find(s.substr(0, L)) != st.end()){ string temp= s.substr(0, L); dfs(s.substr(L), wordDict, res, s.substr(L).empty() ? path + temp : path + temp + ' '); } } } };
|
等价于
class Solution { public: vector<string> res; vector<string> wordBreak(string s, vector<string>& wordDict) { string path; dfs(s, wordDict, path); return res; } void dfs(string s, vector<string>& wordDict, string path){ if(s.empty()){ res.push_back(path); return; } set<string> st(wordDict.begin(), wordDict.end()); int n = s.size(); for(int L = 0; L < n + 1; L ++){ if(st.find(s.substr(0, L)) != st.end()){ string temp= s.substr(0, L); dfs(s.substr(L), wordDict, s.substr(L).empty() ? path + temp : path + temp + ' '); } } } };
|