140. 单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
思路
想到了单词拆分,可以用动态规划先判断字符串s中每个位置i是否可以拆分为单词,dp[i]表示[0, i)可以拆分,然后就可以根据dp[i]来解决这个问题。
具体而言,我们可以判断[i, end)组成的单词是否存在于字典中,若存在,并且dp[i]为true,就说明存在一个方案,可以把[i, end)组成的单词加入到临时答案数组tmp中,然后在递归地对[0, i)开始判断处理,递归结束条件,当i为0时,证明拆分完毕,可以把临时答案数组tmp的结果输出到最后返回数组ans中。
代码
class Solution {
public:
vector<string> wordBreak(string s, vector<string>& wordDict) {
//139解法
unordered_set<string> wordDictSet;
for(const string& word : wordDict) {
wordDictSet.insert(word);
}
int n = s.size();
//动态规划判断能否拆分
vector<bool> dp(n +