虽然这道题归类在DP类但是我没有想到该如何用DP的思想去求解这个问题,看到这个题目的第一瞬间就是想到取用回溯的方法去求解这个问题,那么利用回溯法就非常简单,但是博主有个问题就是超时,但是我看了讨论取得一些解法方法类似他们居然就不回超时,着很奇怪头皮发麻,我先mark一下自己的解法,我觉得思路是没有问题的,哪里需要优化一下是一个问题。具体代码如下:
class Solution {
public:
vector<string> wordBreak(string s, vector<string>& wordDict) {
vector<string>res;
set<string>set;
int m = s.size();
if (m == 0)
return res;
string temp;
for (auto it : wordDict)
set.insert(it);
wordBreak(res, temp, s, 0, m, set);
return res;
}
private:
void wordBreak(vector<string>& res, string& temp, string& s, int start, int& end, set<string>& set)
{
if (start == end)
res.push_back(temp);
else
{
for (int i = start; i < end; i++)
{
if (set.count(s.substr(start, (i - start + 1))))
{
temp += s.substr(start, (i - start + 1));
if (i != end - 1)
temp.push_back(' ');
wordBreak(res, temp, s, i + 1, end, set);
if (i != end - 1)
temp.pop_back();
temp.erase(temp.end() - (i - start + 1), temp.end());
}
}
}
}
};
老样子我们这里利用set来方便查找,查找记录所有可能性,当符合条件则写入res中。方法思路很简单。