1.题目描述

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"]
]
也就是给定一个字符串,找出所有可能的划分,每一个划分的每一个字串都是回文串。设这个划分函数为partition_index(string s,int begin,int end)

2.解题思路

蛮力法当然是可以解决这个问题,对于一个长度为n的字符串,有2n-1种划分方法,只需要判断每种划分是否满足条件即可,虽然不知道暴力法能不能在系统里面ac掉,但是这样显然不是一个正常的程序员该干的事。不过蛮力法会给我们一些启示。我们从为什么蛮力法会有2n-1种划分方法开始分析。

当然,这也很容易分析,对于长度为n的字符串s0s1…sk…sn-1,在sk和sk-1之间我们可以选择截断与不截断,但是,我们可以基于这个思路理出一个递归的思路,那就是,对于字符串sbeginsbegin+1…sbegin+k…sn-1,所有可能满足条件的划分分为两类:

(1)在sbegin和sbegin+1之间有隔断,这种情况,只需sbegin和partition_index(s,begin+1,n-1)连接起来即可

(2)在sbegin和sbegin+1之间无隔断,这种情况,需找到至少包含sbegin和sbegin+1的一个回文字符串,如果能够找到,比如,sbegin…sbegin+k是一个回文字符串,那么,将这个回文字符串和partition_index(s,k+1,n-1)连接起来,注意,可能找到不止一个包含s0和s1的回文字符串,那么有多少个,就多出多少类划分可能;如果找不到,那么返回空vector.

3.代码

#include <iostream>

#include <vector>

#include <string>

#include <iterator>

using namespace std;

vector<vector<string> > partition(string s);

vector<vector<string> > partition_index(string s, int begin, int end);

bool isPalindrome(string s, int begin,int end);

int main()

{

    partition("cdd");

    return 0;

}

 

vector<vector<string> > partition(string s) {

 

    return partition_index(s,0,s.length()-1);

    

}

 

vector<vector<string> > partition_index(string s, int begin, int end)

{

    vector<vector<string> > result;

 

    //边界条件

    if(begin == end)

    {

        vector<string> item;

        item.push_back(s.substr(begin,1));       

        result.push_back(item);

        return result;

    }

    if(begin > end) return result;

    

    //如果在begin与begin+1之间有划分

    vector<vector<string> > result_part1;

    result_part1 = partition_index(s,begin+1,end);

    if(!result_part1.empty())

    {

        vector<vector<string> >::iterator iter_vv;

        for(iter_vv = result_part1.begin();iter_vv!=result_part1.end();++iter_vv)

        { 

            vector<string> temp;

            //temp = *iter_vv;

            temp.push_back(s.substr(begin,1));

            

            vector<string>::iterator iter_v;

            for(iter_v = (*iter_vv).begin();iter_v!= (*iter_vv).end();++iter_v)

            {

                temp.push_back(*iter_v);

            }

            result.push_back(temp);

        }

    }

    

    

    //如果在begin和begin+1之间无划分

    int nextSeg = begin +1;

    while(nextSeg<=end)

    {

 

        //找到了回文字符串

        if(isPalindrome(s,begin,nextSeg))

        {

            vector<vector<string> >result_part2_1;

            result_part2_1  = partition_index(s,nextSeg+1,end);

            if(!result_part2_1.empty())

            {

                vector<vector<string> >::iterator iter_vv;

                for(iter_vv = result_part2_1.begin();iter_vv!=result_part2_1.end();++iter_vv)

                {

                    vector<string> temp;

              //      temp = *iter_vv;

                    temp.push_back(s.substr(begin,nextSeg));

            

                    vector<string>::iterator iter_v;

                    for(iter_v = (*iter_vv).begin();iter_v!= (*iter_vv).end();++iter_v)

                    {

                        temp.push_back(*iter_v);

                    }

                    result.push_back(temp);

                }

                

            }

            else

            {

                vector<string>temp;

                temp.push_back(s.substr(begin,nextSeg-begin+2));

                result.push_back(temp);

            }

        }

        //继续找看是否有其他的更长的回文字符串

        nextSeg++;

    }

    

    return result;

        

}

 

 

//判断字符串由begin 和end 确定的字串是否为回文字符串

bool isPalindrome(string s, int begin,int end)

{

    if(begin>end)return false;

    if(begin==end)return true;

    if((begin+1)==end)return s[begin]==s[end];

    else

        if(s[begin]==s[end])

            return isPalindrome(s,begin+1,end-1);

        esle return false;

}

 

 

另外,代码可以简化,比如,连接结果的代码可以封装成一个函数.

leetcode—Palindrome 解题报告的更多相关文章

  1. LeetCode: Permutations 解题报告

    Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...

  2. 【LeetCode】409. Longest Palindrome 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:字典统计次数 方法二:HashSet 方法三 ...

  3. 【LeetCode】214. Shortest Palindrome 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 前缀是否回文 判断前缀 相似题目 参考资料 日期 题 ...

  4. 【LeetCode】125. Valid Palindrome 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 列表生成式 正则表达式 双指针 日期 题目地址:https:/ ...

  5. LeetCode: Valid Palindrome 解题报告

    Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...

  6. LeetCode C++ 解题报告

    自己做得LeetCode的题解,使用C++语言. 说明:大多数自己做得,部分参考别人的思路,仅供参考; GitHub地址:https://github.com/amazingyyc/The-Solut ...

  7. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  8. LeetCode: Subsets 解题报告

    Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...

  9. LeetCode: Triangle 解题报告

    Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...

随机推荐

  1. BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆

    Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 &l ...

  2. [转载]自定义ASP.NET MVC Html辅助方法 TagBuilder

    在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...

  3. What are the advantages of logistic regression over decision trees?FAQ

    What are the advantages of logistic regression over decision trees?FAQ The answer to "Should I ...

  4. 团体程序设计天梯赛-练习集L1-010. 比较大小

    L1-010. 比较大小 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 本题要求将输入的任意3个整数从小 ...

  5. 汇编Ring 3下实现 HOOK API

    [文章标题]汇编ring3下实现HOOK API [文章作者]nohacks(非安全,hacker0058) [作者主页]hacker0058.ys168.com [文章出处]看雪论坛(bbs.ped ...

  6. Eclipse执行Hadoop WordCount

    前期工作 我的Eclipse是安装在Windows下的,通过Eclipse执行程序连接Hadoop, 需要让虚拟机的访问地址和本机的访问地址保持在同一域内,虚拟机的地址更改前面的文章介绍过了,如果想改 ...

  7. cocos2dx addchild坐标问题

    a.addchild(b); 会把a->getBoundingBox矩形的左下角坐标点和b的锚点贴合在一起.  ----- 其他引擎默认不是这样的,所以再跨平台导数据的时候,要注意这些细微的差别 ...

  8. cocos2d-html5 onEnter init ctor构造函数 ----js特有特性(和c++有一点不一样)

    ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认ctor,为对象的构造函数,其它也可以默认其它函数为构造函数. 说白了就是: ctor构造函数 new 对象后自动 ...

  9. SGU 168

    SGU 168,寻找矩阵中右上方,右方,下方最小的元素,采用动态规划解答. #include <iostream> #include <vector> #include < ...

  10. IT项目量化管理:细化、量化与图形化 与 中国IT项目实施困惑

    IT项目开发和实施的组织先后在组织中引入项目管理模型的管理制度.流程和方法,但收入甚微.大量的IT项目依然面临着无休止的需求蔓延与频繁加班.项目工期失控.质量低下等典型的项目失控现象.对项目引入量化意 ...