Problem 131. 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.
Example:
Input: "aab" Output: [ ["aa","b"], ["a","a","b"] ]
-
解题思路
本题要求将一个字符串拆分成多个回文子串的所有情况,可用递归的方式解决。令 res 为输出结果,ans 为每一种拆分成子串的方式,s 为输入的字符串,len 为 s 的长度。该算法的思路是:
- 对输入字符串 s 进行遍历,如果 s[0] 到 s[i] 是回文子串,则将 s[0] 到 s[i] 组成的子串放入ans 中,再以递归的方式处理 s[i+1] 到 s[len-1] 组成的子串;
- 如果 s[0] 到 s[i] 不是回文子串,则继续判断 s[0] 到 s[i+1] 是否是回文子串,如果 s[0] 到 s[i+1] 是回文子串,则以递归的方式处理 s[i+2] 到 s[len-1] 组成的子串…
- 重复上述操作,直到 i = len(即遍历完了字符串s),此时 ans 是一种拆分情况,并将 ans 存入 res 中。
- 代码实现
class Solution {
public:
vector<vector<string> > partition(string s) {
vector<vector<string> > res;
int len = s.length();
if(len == 0)
return res;
vector<string> ans;
helper(s, 0, ans, res);
return res;
}
void helper(string &s, int begin, vector<string>& ans, vector<vector<string> >& res){
int len = s.length();
if(begin == len){
res.push_back(ans);
return;
}
for(int i = begin; i < len; ++i){
if(!isPalindrome(s, begin, i))
continue;
string sub = s.substr(begin, i-begin+1);
ans.push_back(sub);
helper(s, i+1, ans, res);
ans.pop_back();
}
}
bool isPalindrome(string &s, int begin, int end){
while(begin < end){
if(s[begin] != s[end])
return false;
begin++;
end--;
}
return true;
}
};