1. 程式人生 > >LeetCode 140. Word Break II

LeetCode 140. Word Break II

問題

解法

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); } } } } };