|
| 1 | +[To Index](/index.md) |
| 2 | +--- |
| 3 | +# 131.Palindrome Partitioning |
| 4 | +> 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 |
| 5 | +难度:Medium |
| 6 | +返回 s 所有可能的分割方案。 |
| 7 | + |
| 8 | +示例: |
| 9 | +``` |
| 10 | +输入: "aab" |
| 11 | +输出: |
| 12 | +[ |
| 13 | + ["aa","b"], |
| 14 | + ["a","a","b"] |
| 15 | +] |
| 16 | +``` |
| 17 | +直观解决方法:递归。 |
| 18 | +因为所有子数组都是回文,所以从第一个开始,找到一个回文后,将剩下的子串找出所有的可能性组合,最后再合并即可。 |
| 19 | +代码如下: |
| 20 | + |
| 21 | +``` |
| 22 | +class Solution { |
| 23 | +public: |
| 24 | + vector<vector<string>> partition(string s) { |
| 25 | + int n=s.length(),cnt=0; |
| 26 | + vector<vector<string>> res; |
| 27 | + vector<string> ret; |
| 28 | + if (n == 1) |
| 29 | + { |
| 30 | + ret.push_back(s); |
| 31 | + res.push_back(ret); |
| 32 | + return res; |
| 33 | + } |
| 34 | +
|
| 35 | + vector<vector<string>> tmp; |
| 36 | + for(int i=1;i<n;i++) |
| 37 | + { |
| 38 | + string fir=s.substr(0,i); |
| 39 | + if(ispalind(fir)) |
| 40 | + { |
| 41 | + tmp=merge(fir,partition(s.substr(i,n-i))); |
| 42 | + res.insert(res.end(),tmp.begin(),tmp.end()); |
| 43 | + } |
| 44 | + } |
| 45 | + if(ispalind(s)) |
| 46 | + { |
| 47 | + ret.push_back(s); |
| 48 | + res.push_back(ret); |
| 49 | + } |
| 50 | + return res; |
| 51 | + |
| 52 | + } |
| 53 | + vector<vector<string>> merge(string a, vector<vector<string>>b) |
| 54 | + { |
| 55 | + vector<vector<string>> res; |
| 56 | +
|
| 57 | + for(int i=0;i<b.size();i++) |
| 58 | + { |
| 59 | + vector<string>tmp; |
| 60 | + tmp.push_back(a); |
| 61 | + tmp.insert(tmp.end(),b[i].begin(),b[i].end()); |
| 62 | + res.push_back(tmp); |
| 63 | + } |
| 64 | + return res; |
| 65 | + } |
| 66 | + bool ispalind(string s) |
| 67 | + { |
| 68 | + int n=s.length(); |
| 69 | + for(int i=0;i<n/2;i++) |
| 70 | + if(s[i]!=s[n-i-1]) return false; |
| 71 | + return true; |
| 72 | + } |
| 73 | +}; |
| 74 | +``` |
| 75 | + |
| 76 | +定义了一个函数来判断是否是回文,另一个函数用来将第一个子串和剩下的回文向量合并,最后判断整个字符串是否是回文。 |
| 77 | +但这样并不高效。因为运算时间比较长。 |
| 78 | +提交结果的一个比较好的示例如下: |
| 79 | + |
| 80 | +``` |
| 81 | +class Solution { |
| 82 | + vector<vector<string>> res; |
| 83 | + |
| 84 | + void DFS(string& s, int begin, vector<string>& t){ |
| 85 | + if(begin>=s.length()) |
| 86 | + res.push_back(t); |
| 87 | + else{ |
| 88 | + t.push_back(""); |
| 89 | + for(int end=begin;end<s.length();end++) |
| 90 | + if(isParl(s, begin, end)){ |
| 91 | + t[t.size()-1] = s.substr(begin, end-begin+1); |
| 92 | + DFS(s, end+1, t); |
| 93 | + } |
| 94 | + t.pop_back(); |
| 95 | + } |
| 96 | + } |
| 97 | + |
| 98 | + |
| 99 | + bool isParl(string& s, int begin, int end){ |
| 100 | +// 可以用DP存储加速 |
| 101 | + while(begin<end){ |
| 102 | + if(s[begin]!=s[end]) |
| 103 | + return false; |
| 104 | + begin++; |
| 105 | + end--; |
| 106 | + } |
| 107 | + return true; |
| 108 | + } |
| 109 | +public: |
| 110 | + vector<vector<string>> partition(string s) { |
| 111 | + vector<string> t; |
| 112 | + DFS(s, 0, t); |
| 113 | + return res; |
| 114 | + } |
| 115 | +}; |
| 116 | +``` |
| 117 | +采用深度优先搜索DFS,也是递归调用完成。 |
0 commit comments