[LeetCode] Word Break II
Well, it seems that many people meet the TLE problem. Well, I use a simple trick in my code to aoivd TLE. That is, each time before I try to break s
, I call isBreakable
(just wordBreak
from Word Break) to see whether it is breakable. If it is not breakable, then we need not move on. Otherwise, we break it using backtracking.
The idea of backtracking is also typical. Start from index 0
of s
, each time we see a word
that is in wordDict
, add it to a temporary string sentence
. When we reach the end of the s
, add sentence
to sentences
. Then we need to recover sentence
back to its original status before word
was added. So I simply record a temporary string temp
each time before I add word
to sentence
and use it to recover the status.
The code is as follows. I hope it to be self-explanatory enough.
1 class Solution { 2 public: 3 bool isWordBreak(string& s, unordered_set<string>& wordDict) { 4 vector<bool> dp(s.length() + 1, false); 5 dp[0] = true; 6 int minlen = INT_MAX; 7 int maxlen = INT_MIN; 8 for (string word : wordDict) { 9 minlen = min(minlen, (int)word.length()); 10 maxlen = max(maxlen, (int)word.length()); 11 } 12 for (int i = 1; i <= s.length(); i++) { 13 for (int j = i - minlen; j >= max(0, i - maxlen); j--) { 14 if (dp[j] && wordDict.find(s.substr(j, i - j)) != wordDict.end()) { 15 dp[i] = true; 16 break; 17 } 18 } 19 } 20 return dp[s.length()]; 21 } 22 void breakWords(string s, int idx, unordered_set<string>& wordDict, string& sol, vector<string>& res) { 23 if (idx == s.length()) { 24 sol.resize(sol.length() - 1); 25 res.push_back(sol); 26 return; 27 } 28 for (int i = idx; i < s.length(); i++) { 29 string word = s.substr(idx, i - idx + 1); 30 if (wordDict.find(word) != wordDict.end()) { 31 string tmp = sol; 32 sol += word + " "; 33 breakWords(s, i + 1, wordDict, sol, res); 34 sol = tmp; 35 } 36 } 37 } 38 vector<string> wordBreak(string s, unordered_set<string>& wordDict) { 39 string sol; 40 vector<string> res; 41 if (!isWordBreak(s, wordDict)) return res; 42 breakWords(s, 0, wordDict, sol, res); 43 return res; 44 } 45 };