[LeetCode] Word Break, Solution

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     }

你可能感兴趣的:([LeetCode] Word Break, Solution)