zoukankan      html  css  js  c++  java
  • 【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;
            }
    };
  • 相关阅读:
    走进MongoDB(二)
    走进MongoDB(一)
    InnoDB锁与事务模型
    InnoDB引擎架构的主要组件构成
    InnoDB多版本存储引擎简介
    mysql 数据库备份与恢复
    mysql 字符集
    java常见问题笔记
    mysql5.7 Installing MySQL on Microsoft Windows Using a noinstall Zip Archive(mysql解压版安装)
    作业day03吴童
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4530751.html
Copyright © 2011-2022 走看看