leetcode【Palindrome Partitioning 回文字符串划分】

描述

Palindrome Partitioning    Feb 284465 / 15553

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"]
  ]

  字符串能否划分成多个回文串?如果能,输出所有的划分方法。

  分析

用递归来做,任意一个划分的方法,都是一个vector<string>,如果它非空,那么肯定存在他的第一个元素。对任意一个字符串s:

    for i=1:s.length

            s1=s[0~i]

            s2=[i~end]

             s1是回文串吗?如果不是,那就continue

             如果是:

              对s2进行递归,得到s2的输出,s2可能有多种划分方式,那么,在每一种的前面加上s1即可!

    end

    递归结束的条件是,输入的字符串长度为0(那么直接返回空的vector),或者输入的字符串的长度为1(返回仅包含该字母的veector)。

代码

class Solution {
public:
  bool is_huiwen(const string &s)
    {
        int l=s.length();
        int i;
        for(i=0; i<l/2; i++)
            if(s[i] != s[l-1-i])
                return false;
        return true;
    }
    
    vector<vector<string> > partition(string s) 
    {
        
        int l=s.length();
  //   cout<<"l="<<l<<endl;
        vector<vector<string> >vv;
        vector<string> v;
        if(l==0)
        {
            return vv;
        }

        int i;
        for(i=1; i<l; i++)
        {
            string ts=s.substr(0,i);
      //   cout<<"i= "<<i<<" ts= "<<ts;
            if(! is_huiwen(ts) )
                continue;
            string ts_end=s.substr(i,s.length() - i);
     //    cout<<"ts_end = "<<ts_end<<endl;
            vector<vector<string> > vvt;
            vvt=partition(ts_end);
            int j;
            for(j=0; j<vvt.size(); j++)
            {
                
                vvt[j].insert(vvt[j].begin(), ts);
             //  for(int m=0;m<vvt[j].size();m++)cout<<vvt[j][m]<<" ";cout<<endl;
                vv.push_back(vvt[j]);
            }
        }
        if(is_huiwen(s) )
        {
            v.push_back(s);
            vv.push_back(v);
        }
        return vv;
    }
};

Run Status: Accepted!
Program Runtime: 12 milli secs
Progress: 10/ 10 test cases passed.
 
 
inputoutputexpected 
"a"[["a"]][["a"]]
 
"ab"[["a","b"]][["a","b"]]
 
"bb"[["b","b"],["bb"]][["b","b"],["bb"]]
 
"cdd"[["c","d","d"],["c","dd"]][["c","d","d"],["c","dd"]]
 
"dde"[["d","d","e"],["dd","e"]][["d","d","e"],["dd","e"]]
 
"efe"[["e","f","e"],["efe"]][["e","f","e"],["efe"]]
 
"fff"[["f","f","f"],["f","ff"],["ff","f"],["fff"]][["f","f","f"],["f","ff"],["ff","f"],["fff"]]
 
"abbab"[["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]][["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]]
 
"leet"[["l","e","e","t"],["l","ee","t"]][["l","e","e","t"],["l","ee","t"]]
 
"coder"[["c","o","d","e","r"]][["c","o","d","e","r"]]
 
Run Status: Accepted!
Program Runtime: 368 milli secs
Progress: 20/ 20 test cases passed.
 
 
inputoutputexpected 
"a"[["a"]][["a"]]
 
"ab"[["a","b"]][["a","b"]]
 
"bb"[["b","b"],["bb"]][["b","b"],["bb"]]
 
"cdd"[["c","d","d"],["c","dd"]][["c","d","d"],["c","dd"]]
 
"dde"[["d","d","e"],["dd","e"]][["d","d","e"],["dd","e"]]
 
"efe"[["e","f","e"],["efe"]][["e","f","e"],["efe"]]
 
"fff"[["f","f","f"],["f","ff"],["ff","f"],["fff"]][["f","f","f"],["f","ff"],["ff","f"],["fff"]]
 
"abbab"[["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]][["a","b","b","a","b"],["a","b","bab"],["a","bb","a","b"],["abba","b"]]
 
"leet"[["l","e","e","t"],["l","ee","t"]][["l","e","e","t"],["l","ee","t"]]
 
"coder"[["c","o","d","e","r"]][["c","o","d","e","r"]]
 
"cbbbcc"[["c","b","b","b","c","c"],["c","b","b","b","cc"],["c","b","bb","c","c"],["c","b","bb","cc"],["c","bb","b","c","c"],["c","bb","b","cc"],["c","bbb","c","c"],["c","bbb","cc"],["cbbbc","c"]][["c","b","b","b","c","c"],["c","b","b","b","cc"],["c","b","bb","c","c"],["c","b","bb","cc"],["c","bb","b","c","c"],["c","bb","b","cc"],["c","bbb","c","c"],["c","bbb","cc"],["cbbbc","c"]]
 
"ccaacabacb"[["c","c","a","a","c","a","b","a","c","b"],["c","c","a","a","c","aba","c","b"],["c","c","a","a","cabac","b"],["c","c","a","aca","b","a","c","b"],["c","c","aa","c","a","b","a","c","b"],["c","c","aa","c","aba","c","b"],["c","c","aa","cabac","b"],["c","caac","a","b","a","c","b"],["c","caac","aba","c","b"],["cc","a","a","c","a","b","a","c","b"],["cc","a","a","c","aba","c","b"],["cc","a","a","cabac","b"],["cc","a","aca","b","a","c","b"],["cc","aa","c","a","b","a","c","b"],["cc","aa","c","aba","c","b"],["cc","aa","cabac","b"]][["c","c","a","a","c","a","b","a","c","b"],["c","c","a","a","c","aba","c","b"],["c","c","a","a","cabac","b"],["c","c","a","aca","b","a","c","b"],["c","c","aa","c","a","b","a","c","b"],["c","c","aa","c","aba","c","b"],["c","c","aa","cabac","b"],["c","caac","a","b","a","c","b"],["c","caac","aba","c","b"],["cc","a","a","c","a","b","a","c","b"],["cc","a","a","c","aba","c","b"],["cc","a","a","cabac","b"],["cc","a","aca","b","a","c","b"],["cc","aa","c","a","b","a","c","b"],["cc","aa","c","aba","c","b"],["cc","aa","cabac","b"]]
 
"racecar"[["r","a","c","e","c","a","r"],["r","a","cec","a","r"],["r","aceca","r"],["racecar"]][["r","a","c","e","c","a","r"],["r","a","cec","a","r"],["r","aceca","r"],["racecar"]]
 
"danaranad"[["d","a","n","a","r","a","n","a","d"],["d","a","n","a","r","ana","d"],["d","a","n","ara","n","a","d"],["d","a","naran","a","d"],["d","ana","r","a","n","a","d"],["d","ana","r","ana","d"],["d","anarana","d"],["danaranad"]][["d","a","n","a","r","a","n","a","d"],["d","a","n","a","r","ana","d"],["d","a","n","ara","n","a","d"],["d","a","naran","a","d"],["d","ana","r","a","n","a","d"],["d","ana","r","ana","d"],["d","anarana","d"],["danaranad"]]
 
   
 
   
 
   
 
   
 
   
 
 

自己写的测试代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<vector<string> > partition(string s) ;
int main()
{
string ss("ccaacabacb");
vector<vector<string> > vv = partition(ss);
int i,j;
for(i=0; i<vv.size(); i++)
{
    for(j=0; j<vv[i].size(); j++)
        {
            cout<<vv[i][j]<<" ";
        }
        cout<<endl;
}

    return 0;
}

    bool is_huiwen(const string &s)
    {
        int l=s.length();
        int i;
        for(i=0; i<l/2; i++)
            if(s[i] != s[l-1-i])
                return false;
        return true;
    }
    
    vector<vector<string> > partition(string s) 
    {
        
        int l=s.length();
  //   cout<<"l="<<l<<endl;
        vector<vector<string> >vv;
        vector<string> v;
        if(l==0)
        {
            return vv;
        }

        int i;
        for(i=1; i<l; i++)
        {
            string ts=s.substr(0,i);
      //   cout<<"i= "<<i<<" ts= "<<ts;
            if(! is_huiwen(ts) )
                continue;
            string ts_end=s.substr(i,s.length() - i);
     //    cout<<"ts_end = "<<ts_end<<endl;
            vector<vector<string> > vvt;
            vvt=partition(ts_end);
            int j;
            for(j=0; j<vvt.size(); j++)
            {
                
                vvt[j].insert(vvt[j].begin(), ts);
             //  for(int m=0;m<vvt[j].size();m++)cout<<vvt[j][m]<<" ";cout<<endl;
                vv.push_back(vvt[j]);
            }
        }
        if(is_huiwen(s) )
        {
            v.push_back(s);
            vv.push_back(v);
        }
        return vv;
    }


运行:

chen@chen-book1:~$ ./cpp
c c a a c a b a c b
c c a a c aba c b
c c a a cabac b
c c a aca b a c b
c c aa c a b a c b
c c aa c aba c b
c c aa cabac b
c caac a b a c b
c caac aba c b
cc a a c a b a c b
cc a a c aba c b
cc a a cabac b
cc a aca b a c b
cc aa c a b a c b
cc aa c aba c b
cc aa cabac b



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值