LeetCode 140. Word Break II
阿新 • • 發佈:2018-12-31
問題
解法
dp , 狀態dp[i] = true 表示s.substr(i) 是能被分開. 遞推公式為:
dp[i] = dp[i+1] && InDict(s.substr(i, 1)) || dp[i+2] && InDict(s.substr(i, 2)) …
當求出dp[] 陣列後, 可以使用dfs 查詢所有結果。
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
bool dp[s.size()+1];
dp[s.size()] = true;
for (int i=s.size()-1; i>=0; --i)
{
dp[i] = false;
for (int j = 1; i+j<=s.size(); ++j)
{
if (dp[i+j])
{
string now = s.substr(i, j);
if (wordDict.find(now)!= wordDict.end())
{
dp[i] = true;
break;
}
}
}
}
vector<string> ret;
if (dp[0] == false)
return ret;
findResult(ret, 0 , "", dp, s, wordDict);
return ret;
}
private:
void findResult(vector<string> &ret, int pos, string curResult, bool dp[], string& s, unordered_set<string>& wordDict)
{
if (pos == s.size())
{
// elimate last space;
curResult.pop_back();
ret.push_back(curResult);
return;
}
for (int i=1; i+pos <=s.size(); ++i)
{
if (dp[pos+i])
{
string now = s.substr(pos, i);
if (wordDict.find(now) != wordDict.end())
{
findResult(ret, pos+i, curResult + now + " ", dp, s, wordDict);
}
}
}
}
};