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"
.
[Thoughts]
一个DP问题。定义possible[i] 为S字符串上[0,i]的子串是否可以被segmented by dictionary.
那么
possible[i] = true if S[0,i]在dictionary里面
= true if possible[k] == true 并且 S[k+1,j]在dictionary里面, 0<k<i
= false if no such k exist.
[Code]
实现时前面加一个dummy节点,这样可以把三种情况统一到一个表达式里面。
1 bool wordBreak(string s, unordered_set<string> &dict) { 2 string s2 = '#' + s; 3 int len = s2.size(); 4 vector<bool> possible(len, 0); 5 6 possible[0] = true; 7 for(int i =1; i< len; ++i) 8 { 9 for(int k=0; k<i; ++k) 10 { 11 possible[i] = possible[k] && 12 dict.find(s2.substr(k+1, i-k)) != dict.end(); 13 if(possible[i]) break; 14 } 15 } 16 17 return possible[len-1]; 18 }