My first solution was DFS - TLE. Apparently, DFS with TLE usually means DP.
1D DP + Rolling Array:
class Solution { public: bool wordBreak(string s, unordered_set<string> &dict) { int len = s.length(); int lend= dict.size(); if(len == 0 || lend == 0) return false; // Init vector<bool> rec0, rec1; rec0.resize(len); rec1.resize(len); std::fill(rec0.begin(), rec0.end(), false); std::fill(rec1.begin(), rec1.end(), false); // vector<bool> &pre = rec0; vector<bool> &post = rec1; // Start from 0 for(int i = 1; i <= len; i ++) { string sub = s.substr(0, i); if(dict.find(sub) != dict.end()) { pre[i-1] = true; if(i == len) return true; } } for(int i = 1; i < len; i ++) // vertical { for(int j = 0; j < len; j ++) // horizontal { if(pre[j]) { for(int k = 1; k < len - j; k ++) { string sub = s.substr(j + 1, k); if(dict.find(sub) != dict.end()) { post[j + k] = true; if((j + k + 1) == len) return true; } } } } // Rolling array if(i % 2) { pre = rec1; post = rec0; } else { pre = rec0; post = rec1; } } return false; } };
LeetCode "Word Break",布布扣,bubuko.com
原文:http://www.cnblogs.com/tonix/p/3898523.html