Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].
A solution is ["cats and dog", "cat sand dog"].
DFS can be used for this problem. We can start from the first letter of the string and find if current substring is a word is in the dictionary.
C++ Code:
/*
* func: word_break_helper
* goal: dfs helper function for word_break
* @param s: input string s
* @param start: start searching index
* @param sentence: current sentence
* @param dict: input word dict
* @param result: final result set
* return:
*/
void word_break_helper(string s, int start, string &sentence, unordered_set<string> &dict, vector<string> &result){
if(start < 0){
result.emplace_back(sentence.substr(1));
return;
}
for(int i = start; i >= 0; --i){
string tmp_word = s.substr(i, start - i + 1);
size_t curr_length = sentence.length();
if(dict.find(tmp_word) != dict.end()){
sentence.insert(0, " " + tmp_word);
word_break_helper(s, i-1, sentence, dict, result);
sentence = sentence.substr(sentence.length() - curr_length);
}
}
}
/*
* func: word_break
* goal: return all possible sentences that can be constructed from the input string and dict
* @param s: input string
* @param dict: input dict
* return: all possible sentences
*/
vector<string> word_break(string s, unordered_set<string> &dict){
vector<string> result;
if(s.length() == 0 || dict.size() == 0){
return result;
}
string sentence = "";
word_break_helper(s, s.length()-1, sentence, dict, result);
return result;
}
Python Code:
# func: eturn all possible sentences that can be constructed from the input string and dict
# @param s: input string
# @param dict: input dict
# @return: all possible sentences
def word_break(s, dict):
if not s or not dict:
return []
result = []
def word_break_helper(start, sentence):
if start < 0:
result.append(sentence[1:])
return
for i in xrange(start, -1, -1):
tmp_word = s[i:start+1]
if tmp_word in dict:
next_sentence = ' ' + tmp_word + sentence
word_break_helper(i-1, next_sentence[:])
word_break_helper(len(s)-1, '')
return result
The test cases for this problem is not so fair. The first time, I did the dfs from 0 and it told me time limit exceed. But when I changed the start to the last letter in the string, it will pass.
No comments:
Post a Comment