给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
· [“aa”,“b”],
· [“a”,“a”,“b”]
]
#include <string>
#include <vector>
using namespace std;
class Solution {
private:
//简单判断回文
bool isPalindromeString(const string& str)
{
int i = 0, j = str.size() - 1;
while (i < j)
{
if (str[i] != str[j]) return false;
++i;
--j;
}
return true;
}
//递归寻找
void partitionStr(
const string &s,
vector<vector<string>>& result,
vector<string>& tempResult)
{
if (!s.empty())
{//可以继续分割
for (int i = 1; i <= s.size(); ++i)
{ //分割s.begin()到s.begin()+i-1的字符子串
string tempStr(s.begin(), s.begin() + i);
if (isPalindromeString(tempStr))//是否回文,继续分割
{
tempResult.emplace_back(tempStr);
string restStr(s.begin() + i, s.end());
partitionStr(restStr, result, tempResult);
tempResult.pop_back();
}
}
}
else
{//无法继续分割,说明s已经被分分割完了 而且 分割的字符字串均为回文
//(非回文的话早就被if判断掉然后进行剪枝了)
result.emplace_back(tempResult);
}
}
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> result;
vector<string, allocator<string>> tempResult;
partitionStr(s, result, tempResult);
return result;
}
};