[LeetCode] Word Break, Solution

来源:互联网 发布:男内裤 知乎 编辑:程序博客网 时间:2024/06/07 02:48

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     }
0 0