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;
            }
    };
  • 相关阅读:
    MySQL concat函数的使用
    不懂技术的人请不要对懂技术的人说这很容易
    css常用样式属性详细介绍
    堆,栈,方法区,常量池,的概念
    Springboot整合 mybatis-generator
    探秘Java中的String、StringBuilder以及StringBuffer
    微信一键登录(微信OAuth2.0)
    ActiveMQ的作用总结(应用场景及优势)以及springboot+activeMq 实战
    SpringBoot几种定时任务的实现方式 和多线程执行任务
    如何使用RedisTemplate访问Redis数据结构
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4530751.html
Copyright © 2011-2022 走看看