Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given
s =
dict =
Return true because
Analysis:For example, given
s =
"leetcode"
,dict =
["leet", "code"]
.Return true because
"leetcode"
can be segmented as "leet code"
.This problem could be done naively using recursion - code given below in Sol 1. However, the time complexity is O(m^n) in worse case, where m is length of the string and n is length of the dictionary.
Obviously, the exponential solution is not optimal. We see this because the recursion has overlapped sub-problems.
Consider using DP. We construct a dp vector, where entry i represents whether s[0 : i-1] can be broke down to words in dictionary. Suppose dp[i-1] == true, dp[i] would be true iff:
1) string from index 0 to i is in dictionary, Or
2) for 0 <= j < i, if dp[j] == true, and string from index j to i is in dictionary
The index map is :
string s: a a c d d a e
i or j: 0 1 2 3 4 5 6
dp index: 0 1 2 3 4 5 6 7
The time complexity of this DP algorithm is O(m*n), the space comlexity is O(m), where m is length of the string and n is length of the dictionary.
Code:
Sol 1 - Recursion:
bool wordBreak(string s, unordered_set<string> &dict) { return recur(s, dict, 0); } bool recur(string s, unordered_set<string> &dict, int st) { if (st==s.length()) return true; for(unordered_set<string>::iterator it=dict.begin(); it!=dict.end(); it++) { string t = *it; int len = t.length(); if (st+len>s.length()) { continue; if (!s.substr(st, len).compare(t)) { if (recur(s, dict, st+len)) return true; } } return false; }
Sol 2 - DP
class Solution { public: bool wordBreak(string s, unordered_set<string>& dict) { vector<bool> dp(s.length()+1, false); dp[0]=true; for (int i=0; i<s.length(); i++) { // i-current string index if (dict.find(s.substr(0,i+1))!=dict.end()) { dp[i+1]=true; continue; } for (int j=0; j<i; j++) { if (dp[j+1]==true && dict.find(s.substr(j+1, i-j))!=dict.end()) { dp[i+1]=true; break; } } } return dp[s.length()]; } };
No comments:
Post a Comment