判断字符串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;}
运行结果如下:
- 判断字符串string所有分割和子串是否为回文(palindrome)并返回结果(Palindrome Partitioning)
- Palindrome Partitioning 分割成回文子字符串
- Palindrome Partitioning 分割字符串为回文@LeetCode
- Palindrome Partitioning 回文串分割,求所有可能的分割
- leetcode:Palindrome Partitioning (字符串分割成回文串的所有方式) 【面试算法题】
- [Lintcode]Palindrome Partitioning分割回文串
- [LeetCode] Palindrome Partitioning 回文分割
- 回文子串划分 Palindrome Partitioning
- [LeetCode]-Palindrome Partitioning 求回文分割的所有情况
- LeetCode(Palindrome Partitioning) 将字符串分割成回文字符串
- LeetCode OJ 之 Palindrome Partitioning (字符串的回文分割)
- Palindrome Partitioning&II(回文字符串)
- [LeetCode]Palindrome Number 判断二进制和十进制是否为回文
- [C++]LeetCode: 121 Palindrome Partitioning (分割回文子串 回溯法)
- leetCode_234. Palindrome Linked List(判断是否为回文串)
- Valid Palindrome 判断一个字符串是否是回文串
- 136.Palindrome Partitioning-分割回文串(中等题)
- 最小回文分割数 Palindrome Partitioning II
- 13-3-17 如何在fedora 16下以root用户登录
- 对于4个问题的感慨
- 用母函数的思路解释母函数的代码
- 第二次实验报告
- 电脑基本技能
- 判断字符串string所有分割和子串是否为回文(palindrome)并返回结果(Palindrome Partitioning)
- ZOJ BCD Code 记忆化搜索+数位DP+AC自动机
- 比较java的arraylist和linkedlist
- HDU 1588 Gauss Fibonacci
- Lua 程序设计初步
- Html/CSS菜单代码
- usaco-1.5-总结
- 树状数组
- 获取某一天之前或者之后多少天的日期