• 【Palindrome Partitioning】cpp


    题目:

    Given a string s, partition s such that every substring of the partition is a palindrome.

    Return all possible palindrome partitioning of s.

    For example, given s = "aab",
    Return

      [
        ["aa","b"],
        ["a","a","b"]
      ]

    代码:

    class Solution {
    public:
        vector<vector<string>> partition(string s) {
                vector<vector<string> > ret;
                vector<string> tmp;
                Solution::dfs(ret, tmp, s, 0, s.size()-1);
                return ret;
        }
        static void dfs(vector<vector<string> >& ret, vector<string>& tmp, string& s, int begin, int end)
        {
                if ( begin>end ) { ret.push_back(tmp); return; }
                for ( int i = begin; i <= end; ++i )
                {
                    if ( Solution::isPalindrome(s, begin, i) )
                    {
                        tmp.push_back(s.substr(begin,i-begin+1));
                        Solution::dfs(ret, tmp, s, i+1, end);
                        tmp.pop_back();
                    }
                }
        }
        static bool isPalindrome(string& s, int begin, int end)
        {
                while ( begin<end && s[begin]==s[end] ) { begin++; end--; }
                return begin>=end;
        }
    };

    tips:

    把问题转化为深搜:字符串s有n个字符,因此可以有n个切的位置(包括不切)。

    按照深搜的模板写出来代码(dfs终止条件;深搜遍历条件等)。

    注意一个细节,传入下一层dfs时是从i+1到end,之前一直写成了begin+1犯了低级错误。

    深搜的时间复杂度为O(2^n) 空间复杂度为O(1)。

    深搜在这道题上也有不足之处,很多子字符串是否是回文算过了不止一遍,自然联想能否用动规算法保存每一轮的判断结果。

    ====================================================

    先往后走,后面再研究动态规划的做法。

    ==================================================

    第二次过这道题,用dfs做的,其中每层里面i代表的是截取字符串的长度,自然由1到s.size()。

    class Solution {
    public:
            vector<vector<string> > partition(string s)
            {
                vector<vector<string> > ret;
                vector<string> tmp;
                Solution::dfs(ret, tmp, s);
                return ret;
            }
            static void dfs(vector<vector<string> >& ret, vector<string>& tmp, string s)
            {
                if ( s.size()<1 )
                {
                    ret.push_back(tmp);
                    return;
                }
                for ( int i=1; i<=s.size(); ++i )
                {
                    if ( Solution::isPalindrome(s.substr(0,i)) )
                    {
                        tmp.push_back(s.substr(0,i));
                        Solution::dfs(ret, tmp, s.substr(i,s.size()-i));
                        tmp.pop_back();
                    }
                }
            }
            static bool isPalindrome(string s)
            {
                int begin = 0;
                int end = s.size()-1;
                while ( begin<end )
                {
                    if ( s[begin]!=s[end] ) return false;
                    begin++;
                    end--;
                }
                return true;
            }
    };
  • 相关阅读:
    BUG处理流程图
    开发认为不是bug,你该如何处理?
    读书笔记:平台革命
    我的工具:开发自己的代码生成工具
    我的工具:Db SQL Monitor
    我的工具:Ping工具
    windows配置nginx实现负载均衡集群 -请求分流
    Oracle完全卸载详解
    Wireshark过滤语句中常用的操作符
    TCP 传输控制协议(转)
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4530751.html
Copyright © 2020-2023  润新知