判断字符串string所有分割和子串是否为回文(palindrome)并返回结果(Palindrome Partitioning)

来源:互联网 发布:添加网络位置 ftp 编辑:程序博客网 时间:2024/06/05 00:07

在网站http://leetcode.com/onlinejudge上

原题1是这样的:(解答见函数partition)

Palindrome Partitioning

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

翻译一下:给定字符串string s,把s进行任意分割,如果每个分割后的字串是回文,则返回这样的分割。


原题2是这样的:(解答见函数minCut)

Palindrome Partitioning II

Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

翻译一下:题目如上,只是返回的是最小的划分为多少


注:所谓回文,即无论正序还是逆序字符串的结果是一样的。

这是一个典型的递归问题,解答代码如下:

注:本工程共三个文件:main.cpp demo.h demo.cpp  (开发工具Dev-C++5.4.0)

//main.cpp #include <iostream>#include <string>#include "demo.h"#include <vector>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std;int main(int argc, char *argv[]) {demo foo1;string s("aab");if(foo1.is_palindrome(s)){cout<<"string:"<<s<<" is palindrome"<<endl;}else{cout<<"string:"<<s<<" is not palindrome"<<endl;}cout<<"input"<<endl;cout<<"\""<<s<<"\""<<endl; vector< vector<string> > res;res = foo1.substring(s);foo1.show_vector(res);vector< vector<string> > res2;res2 = foo1.part(s);foo1.show_vector(res2); vector< vector<string> > res3;res3 = foo1.partition(s);foo1.show_vector(res3);int res4;res4 = foo1.minCut(s);cout<<"minimum cuts="<<res4<<endl; return 1;}

//demo.h #ifndef DEMO_H_#define DEMO_H_#include<vector>#include<string>using namespace std;class demo{private:    vector< vector<string> > merge(string, vector< vector<string> >);public:    demo();    demo(int);    ~demo();    bool is_palindrome(string s);    void show_vector(vector< vector<string> > s);    vector< vector<string> > part(string s);    vector< vector<string> > substring(string s);    vector< vector<string> > partition(string s);    int minCut(string s);};#endif

//demo.cpp#include <iostream>#include "demo.h"#include <fstream>#include <string>#include <vector>#include <climits>using namespace std;//constructorsdemo::demo(){}vector< vector<string> > demo::substring(string s){    //return the substrings which is palindrome    vector< vector<string> > result;    for(int i=0; i < s.size(); i++)        {            vector<string> temp;            int sub_length = i+1;            bool b_first = true;            for (int j=0; j<=s.size()-sub_length; j++)                {                    string sub=s.substr(j,sub_length);                    if (this->is_palindrome(sub))                        {                            temp.push_back(sub);                        }                }            if(temp.size() > 0)                {                    result.push_back(temp);                }        }    return result;}vector< vector<string> > demo::partition(string s){    //Palindrome Partitioning    //return the partitions which each kind of substring is palindrome    vector< vector<string> > result;    vector< vector<string> > sub_str;    sub_str = this->part(s);    for (int i=0; i<sub_str.size(); i++)        {            bool b_add = true;            for (int j=0; j<sub_str[i].size(); j++)                {                    if(!this->is_palindrome(sub_str[i][j]))                        b_add = false;                }            if(b_add)                result.push_back(sub_str[i]);        }    return result;}int demo::minCut(string s){    //Palindrome Partitioning II    // return the minimum cuts needed for a palindrome partitioning of s    int result;    vector< vector<string> > partition_res;    partition_res = this->partition(s);    int min_len_value =  INT_MAX;    for (int i=0; i<partition_res.size(); i++)        {            if (partition_res[i].size() < min_len_value)                {                    min_len_value = partition_res[i].size();                }        }    result = min_len_value;    return result;}vector< vector<string> > demo::part(string s){    // find all sub_partition for string s    vector< vector<string> > result;    for(int i=0; i < s.size(); i++)        {            if (s.size()-1 == i)  // when i at the end position                {                    vector<string> tmp;                    tmp.push_back(s);                    result.push_back(tmp);                    return result;                }            vector< vector<string> > temp2;            int sub_length = i+1;            string sub_str;            string left_str;            sub_str = s.substr(0,sub_length);            left_str = s.substr(sub_length,s.size()-sub_length);            temp2 = merge(sub_str,this->part(left_str));            for (int j=0; j<temp2.size(); j++)                {                    result.push_back(temp2[j]);                }        }    return result;}vector< vector<string> > demo::merge(string s, vector< vector<string> > v){    vector< vector<string> > result;    for (int i=0; i < v.size(); i++)        {            vector<string> temp;            temp.push_back(s);            for (int j=0; j<v[i].size(); j++)                {                    temp.push_back(v[i][j]);                }            result.push_back(temp);        }    return result;}bool demo::is_palindrome(string s){    //judge is it a palindrome    for(int i=0; i<s.size()/2; i++)        {            if (s[i] != s[s.size()-(i+1)])                return false;        }    return true;}void demo::show_vector(vector< vector<string> > s){    // show the s content.    cout<<"output"<<"  len="<<s.size()<<endl;    cout<<"[";    for (int i=0; i<s.size(); i++)        {            cout<<"[";            for (int j=0; j<s[i].size(); j++)                {                    cout<<"\""<<s[i][j]<<"\"";                    if ( j != (s[i].size()-1) )                        cout<<",";                }            cout<<"]";            if (i != (s.size()-1))                cout<<",";        }    cout<<"]"<<endl;}//deconstructordemo::~demo(){    cout<<"Bye!"<<endl;}

运行结果如下:


原创粉丝点击