本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

LeetCode:Word Break II(DP)

题目地址:请戳我

这一题在leetcode前面一道题word break 的基础上用数组保存前驱路径,然后在前驱路径上用DFS可以构造所有解。但是要注意的是动态规划中要去掉前一道题的一些约束条件(具体可以对比两段代码),如果不去掉则会漏掉一些解(前一道题加约束条件是为了更快的判断是字符串是够能被分词,这里是为了找出所有分词的情况)

代码如下:

 1 class Solution {
 2 public:
 3     vector<string> wordBreak(string s, unordered_set<string> &dict)
 4     {
 5         // Note: The Solution object is instantiated only once and is reused by each test case.
 6         vector<string> result;
 7         if(dict.empty())
 8             return result;
 9         const int len = s.size();
10         bool canBreak[len]; //canBreak[i] = true 表示s[0~i]是否能break
11         memset(canBreak, 0, sizeof(bool)*len);
12         bool **pre = new bool *[len];//如果s[k..i]是字典中的单词,则pre[i][k]=true
13         for(int i = 0; i < len; i++)
14         {
15             pre[i] = new bool[len];
16             memset(pre[i], 0 , sizeof(bool)*len);
17         }
18 
19         for(int i = 1; i <= len; i++)
20         {
21             if(dictContain(dict, s.substr(0, i)))
22             {
23                 canBreak[i-1] = true;
24                 pre[i-1][0] = true;
25             }
26             if(canBreak[i-1] == true)
27             {
28                 for(int j = 1; j <= len - i; j++)
29                 {
30                     if(dictContain(dict,s.substr(i, j)))
31                     {
32                         canBreak[j+i-1] = true;
33                         pre[j+i-1][i] = true;
34                     }
35                 }
36             }
37         }
38         //return false;
39         vector<int> insertPos;
40         getResult(s, pre, len, len-1, insertPos, result);
41         return result;
42     }
43 
44     bool dictContain(unordered_set<string> &dict, string s)
45     {
46         unordered_set<string>::iterator ite = dict.find(s);
47         if(ite != dict.end())
48             return true;
49         else return false;
50     }
51 
52     //在字符串的某些位置插入空格,返回新字符串
53     string insertBlank(string s,vector<int>pos)
54     {
55         string result = "";
56         int base = 0;
57         for(int i = pos.size()-1; i>=0; i--)
58         {
59             if(pos[i] == 0)continue;//开始位置不用插入空格
60             result += (s.substr(base, pos[i]-base) + " ");
61             base = pos[i];
62         }
63         result += s.substr(base, s.length()-base);
64         return result;
65     }
66 
67     //从前驱路径中构造结果
68     void getResult(string s, bool **pre, int len, int currentPos,
69                    vector<int>insertPos,
70                    vector<string> &result)
71     {
72         if(currentPos == -1)
73         {
74             result.push_back(insertBlank(s,insertPos));
75             //cout<<insertBlank(s,insertPos)<<endl;
76             return;
77         }
78         for(int i = 0; i < len; i++)
79         {
80             if(pre[currentPos][i] == true)
81             {
82                 insertPos.push_back(i);
83                 getResult(s, pre, len, i-1, insertPos, result);
84                 insertPos.pop_back();
85             }
86         }
87     }
88 };

 【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3385644.html

posted @ 2013-10-24 11:14  tenos  阅读(2196)  评论(0编辑  收藏  举报

本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

公益页面-寻找遗失儿童