LeetCode Palindrome Partitioning

 1 class Solution {
 2 public:
 3     vector<vector<string> > partition(string s) {
 4         int len = s.length();
 5         vector<vector<string> >* memo = new vector<vector<string> >[len + 1];
 6         vector<vector<string> > ret;
 7         
 8         for (int i=1; i<=len; i++) {
 9             int sub_len = 0;
10             vector<vector<string> >& cur = memo[i];
11             
12             for (int j=i-1; j>=0; j--) {
13                 string sub = s.substr(j, ++sub_len);
14                 
15                 int p=0, q = sub_len - 1; 
16                 for (; p < q; p++, q--) {
17                     if (sub[p] != sub[q]) break;
18                 }
19                 if (p < q) continue; 
20                 
21                 if (j == 0) {
22                     cur.push_back(vector<string>(1, sub));
23                     continue;
24                 }
25                 
26                 for (int k=0; k<memo[j].size(); k++) {
27                     cur.push_back(memo[j][k]);
28                     cur.back().push_back(sub);
29                 }
30             }
31         }
32         ret = memo[len];
33         delete[] memo;
34         return ret;
35     }
36 };

明显感觉可以用DFS进行搜索,但是觉得单纯用dfs的话会有许都状态被重复计算,于是转变思路改用“dp”(也不知道这个是不是算dp),按字符串的长短把每个可能的状态先计算好,提交一次通过,但是时间150+ms,这有点不正常,通常leetcode上的题目时间一般在100-ms,所以翻查了一下网上资料,有的直接使用了dfs,把代码一跑居然只要50+ms,于是自己再写个dfs,的确是只要用这个时间。回过来看,可能是第一种方法在计算各个状态的时候用了太多的vector.push_back操作占用了较多的时间和空间。下面给出dfs代码

 1 class Solution {
 2 private:
 3     vector<vector<string> > ret;
 4 public:
 5     vector<vector<string> > partition(string s) {
 6         ret.clear();
 7         vector<string> m;
 8         dfs(m, s, 0, s.length() - 1);
 9         return ret;
10     }
11 
12     void dfs(vector<string>& m, string& str, int s, int e) {
13         if (s > e) {
14             ret.push_back(m);
15         }
16         for (int i=s; i<=e; i++) {
17             if (!is_palindrome(str, s, i)) continue;
18             m.push_back(str.substr(s, i - s + 1));
19             dfs(m, str, i+1, e);
20             m.pop_back();
21         }
22     }
23 
24 
25     bool is_palindrome(string& s, int i, int j) {
26         while (i < j) {
27             if (s[i++] != s[j--]) return false;
28         }
29         return true;
30     }
31 };

 参考:

zhuli哥的题解:http://www.cnblogs.com/zhuli19901106/p/3570430.html

posted @ 2014-03-26 20:48  卖程序的小歪  阅读(201)  评论(0编辑  收藏  举报