在网站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; //constructors demo::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; } //deconstructor demo::~demo() { cout<<"Bye!"<<endl; }