leetcode【Palindrome Partitioning 回文字符串划分】
2013-07-08 23:18
363 查看
描述
Palindrome Partitioning Feb 284465 / 15553Given 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.
input | output | expected | |
---|---|---|---|
"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.
input | output | expected | |
---|---|---|---|
"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
相关文章推荐
- LeetCode(Palindrome partition 2) 求将一个字符串划分成回文子串 需要分成的段数最少是多少
- LeetCode | 763. Partition Labels 中等偏难贪心算法 把一个字符串划分为有独立字母的最多组的划分方法
- [LeetCode] word break 字符串的划分
- LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)
- [LeetCode] Reverse Words in a String 翻转字符串中的单词
- LeetCode之字符串处理题java
- leetcode -- 541. Reverse String II 【字符串反转 + 双指针 + 状态记录 + 数组与堆内存】
- LeetCode205 Isomorphic Strings同构字符串
- [leetcode, python] Reverse Words in a String 反转字符串
- Leetcode 383. Ransom Note 构造字符串 解题报告
- Leetcode 14 寻找字符串之间的最长前缀
- 【leetcode】回文串划分(DFS)
- 判断字符串是否能分割成字典中的单词(二)——Leetcode系列(十二)
- [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串
- Leetcode 415. Add Strings 字符串加法 解题报告
- LeetCode 之 Valid Palindrome(字符串)
- LeetCode-67-Add Binary(数字/字符串处理)-Easy
- 【LeetCode】5. Longest Palindromic Substring最大Palindromic字符串|DP动态规划
- LeetCode 557. 反转字符串中的单词 III
- leetcode:字符串之Simplify Path