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 = "leetcode"
,
dict = ["leet", "code"]
.
Return true because "leetcode"
can be segmented as "leet
code"
.
Code 1:(recursive with pruning)
class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
if(s.empty()) return wordDict.find("") == wordDict.end()?false:true;
int end = 0;
while( start < s.length() && end < s.length()){
if(wordDict.find(s.substr(start,end - start + 1)) == wordDict.end()){
end++;
}else{
start = end + 1;
end = start;
}
}
return start == end;
}
bool recursive_with_prune(int start, int end, string &s, unordered_set<string>& wordDict, vector<vector<int>> &res){
if(start >= s.length()){
return true;
}
if(end < s.length() && res[start][end] != -1){
return res[start][end] == 1?true:false;
}
for(int i = end; i < s.length(); i ++){
if(wordDict.find(s.substr(start, i- start + 1)) != wordDict.end() && recursive_with_prune(i+1, i+1, s, wordDict,res)){
return true;
}
}
res[start][end] = false;
return false;
}
};
Code 2: (DP)
class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
if(s.empty()) return wordDict.find("") == wordDict.end()?false:true;
return dp(s,wordDict);
}
bool dp(string &s, unordered_set<string>& wordDict){
int n = s.length();
vector<bool> dp(n,false); //dp[i] means s[0....i] can formed by the dict
for(int i = 0 ; i < n; i ++){
if(wordDict.find(s.substr(0,i+1))!=wordDict.end()) dp[i] = true;
else{
for(int j = 0; j < i; j ++){//if s[0...j] can be formed by dict and s[j+1,..,i] is in the dict, then dp[i] = true
if(dp[j] && wordDict.find(s.substr(j+1,i-j))!=wordDict.end())
dp[i] = true;
}
}
}
return dp[n-1];
}
};