一个string对象,将其进行划分成若干子字符串,要求每一字符串都是回文的(即正着读和倒着读是一样的)。设计一个算法,返回所有可能的字符串。

初步分析这个问题,要对每一个自字符串再次划分,所以非常适合递归。算法如下:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>>result;
        if(s=="")
        return result;
        result=part(s);

        return result;
    }
private:
    vector<vector<string>> part(string s)
    {
        vector<vector<string>>result;
        int length=s.size();
        vector<string> single;
        for(int index=0;index<length;index++)
        {
            single.push_back(s.substr(index,1));
        }
        result.push_back(single);

        for(int index=0;index<length;index++)//注意index=0;要从单个字符做起,因为单个字符也是回文的;我最开始把单个字符的情况单独列出,这样是不妥的
        {
            if(s[index]==s[0]&&isPalindrome(s.substr(0,index+1)))//如果s[index]!=s[0],可以确定0到index的字符串不是回文的
            {
                string lResult=s.substr(0,index+1);
                if(index!=length-1)
                {
                    vector<vector<string>> rResult=part(s.substr(index+1,length-index));
                    int rLen=rResult.size();
                    for(int rIndex=0;rIndex<rLen;rIndex++)
                    {
                        vector<string> result1;
                        result1.push_back(lResult);
                        for(int rIndex2=0;rIndex2<rResult[rIndex].size();rIndex2++)
                        {
                            result1.push_back(rResult[rIndex][rIndex2]);
                        }
                        result.push_back(result1);
                    }
                }
                else
                {
                    vector<string> result1;
                    result1.push_back(lResult);
                    result.push_back(result1);
                }
            }
        }
        return result;
    }
    bool isPalindrome(string s)
    {
        for(int start=0,end=s.size()-1;start<end;start++,end--)
        {
            if(s[start]!=s[end])
            {
                return false;
            }
        }
        return true;
    }
};