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 }