码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode: Word Break

时间:2014-08-22 23:42:29      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   strong   for   ar   

LeetCode: Word Break

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".

地址:https://oj.leetcode.com/problems/word-break/

算法:显然,这一道动态规划的题目。用数组dp来存储每一个子问题,其中dp[i]表示在从0到i(包括i)的字串是否能够由字典组成。那么dp[i+1]的解就可以表示成:是否存在一个j(0<=j<=i+1)使得dp[j]为真且从j+1到i+1的字串在字典中。代码如下:

 1 class Solution {
 2 public:
 3     bool wordBreak(string s, unordered_set<string> &dict) {
 4         if(s.empty())   return false;
 5         int len = s.size();
 6         unordered_set<string>::iterator end_it = dict.end();
 7         vector<bool> dp(len);
 8         if(dict.find(s.substr(0,1)) != end_it){
 9             dp[0] = true;
10         }else{
11             dp[0] = false;
12         }
13         for(int i = 1; i != len; ++i){
14             if(dict.find(s.substr(0,i+1)) != end_it){
15                 dp[i] = true;
16                 continue;
17             }
18             int j = 0;
19             while(j<i && (!dp[j] || dict.find(s.substr(j+1,i-j)) == end_it))    ++j;
20             dp[i] = (j < i);
21         }
22         return dp[len-1];
23     }
24 };

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].

A solution is ["cats and dog", "cat sand dog"].

地址:https://oj.leetcode.com/problems/word-break-ii/

算法:第二题与第一题不同的是,第二题需要构造出所有可能的解,这样的话,我们就必须把每个子问题的所有解情况都存储起来。用一个二维数组dp来存储每一个子问题的解,其中dp[i]存储了所有满足条件的j。最后利用递归的方法构造出所有的解,看代码应该会比说的更清楚吧:

 1 class Solution {
 2 public:
 3     vector<string> wordBreak(string s, unordered_set<string> &dict) {
 4         int n = s.size();
 5         if (n < 1)  return vector<string>();
 6         vector<vector<int> > dp(n);
 7         unordered_set<string>::iterator end_it = dict.end();
 8         if (dict.find(s.substr(0,1)) != end_it){
 9             dp[0].push_back(0);
10         }
11         for(int i = 1; i != n; ++i){
12             if (dict.find(s.substr(0,i+1)) != end_it){
13                 dp[i].push_back(0);
14             }
15             for (int j = i-1; j >= 0; --j){
16                 if (!dp[j].empty() && dict.find(s.substr(j+1,i-j)) != end_it){
17                     dp[i].push_back(j+1);
18                 }
19             }
20         }
21         return constructResult(s,dp,n);
22     }
23     vector<string> constructResult(string &s, vector<vector<int> > &dp,int n){
24         if(n < 1)
25             return vector<string>();
26         vector<int>::iterator it = dp[n-1].begin();
27         vector<string> result;
28         for (; it != dp[n-1].end(); ++it){
29             if (*it == 0){
30                 result.push_back(s.substr(0,n));
31                 continue;
32             }
33             vector<string> temp = constructResult(s,dp,*it);
34             vector<string>::iterator str_it = temp.begin();
35             for(; str_it != temp.end(); ++str_it){
36                 result.push_back(*str_it + " " + s.substr(*it,n-(*it)));
37             }
38         }
39         return result;
40     }
41 };

 

 

LeetCode: Word Break

标签:style   blog   http   color   os   io   strong   for   ar   

原文地址:http://www.cnblogs.com/boostable/p/leetcode_word_break.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!