zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Jquery的小案例4、实现表单的验证(用户名和邮箱)
    Ubuntu下安装Python
    ListView列宽自适应
    IPtables 版本升级到 v1.4.9
    穿过已知点画平滑曲线(3次贝塞尔曲线)
    贪心算法——NY 14 会场安排问题
    零是奇数还是偶数?
    免费淘宝IP地址库简介及PHP/C#调用实例
    html锚点(mao dian)特殊的超链接
    怎么查看自己电脑的IP地址
  • 原文地址:https://www.cnblogs.com/lailailai/p/3626956.html
Copyright © 2011-2022 走看看