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"
.
We can use dynamic programming to solve this problem. Use split[i] to represent if until ith position of the string it can be split. When we get to (i+1)th position, we can start from 0 to check if s[j..i+1] is a word in dict. When we reach the end, we can get the result.
C++ Code:
/* * func: word_break * goal: to find out if the input string can be split into words in the dict * @param s: input string * @param dict: input dictionary * return: true or false */ /* * split[i] stands for if s[0..i] can be split into words in the dict * complexity: time O(n^2), space O(n) */ bool word_break(string s, unordered_set<string> &dict){ if(s.length() ==0 || dict.size() == 0){ return false; } vector<bool> split(s.length()+1, false); split[0] = true; for(int i = 0; i < s.length(); ++i){ for(int j = 0; j <= i; ++j){ string tmp_word = s.substr(j, i - j + 1); if(dict.find(tmp_word) != dict.end() && split[j]){ split[i+1] = true; } } } return split[s.length()]; }
Python Code:
# func: determine if the input string can be split into words in the dictionary # @param s: input string # @param dict: input dictionary # @return: True of False # complexity: time O(n^2), space O(n) def word_break(s, dict): if not s or not dict: return False splitable = [False] * (len(s)+1) splitable[0] = True for i in xrange(len(s)): for j in xrange(i+1): tmp_word = s[j: i+1] if tmp_word in dict and splitable[j-1]: splitable[i] = True break return splitable[-1]
No comments:
Post a Comment