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

你可能感兴趣的:(partition)