给定字符串 s
, 需要将它分割成一些子串, 使得每个子串都是回文串.
返回所有可能的分割方案.
样例
样例 1:
输入: "a"
输出: [["a"]]
解释: 字符串里只有一个字符, 也就只有一种分割方式 (就是它本身)
样例 2:
输入: "aab"
输出: [["aa", "b"], ["a", "a", "b"]]
解释: 有两种分割的方式.
1. 将 "aab" 分割成 "aa" 和 "b", 它们都是回文的.
2. 将 "aab" 分割成 "a", "a" 和 "b", 它们全都是回文的.
注意事项
- 不同的方案之间的顺序可以是任意的.
- 一种分割方案中的每个子串都必须是
s
中连续的一段.
输入测试数据 (每行一个参数)如何理解测试数据?
class Solution {
public:
/*
* @param s: A string
* @return: A list of lists of string
*/
vector<vector<string>> partition(string &nums) {
// write your code here
vector<vector<string>> ret;
vector<string> tmp;
backtrack(ret, tmp, nums, 0);
return ret;
}
void backtrack(vector<vector<string>>& ret, vector<string> &tempList, string& nums, int start)
{
if(start == nums.size())
{
ret.push_back(tempList);
}
for(int i = start; i < nums.size(); i++)
{
string tmp = nums.substr(start, i-start+1);
if(tmp == "" || !ishuiwen(tmp))
continue;
tempList.push_back(tmp);
backtrack(ret, tempList, nums, i+1);
tempList.erase(tempList.begin() + tempList.size() - 1);
}
}
bool ishuiwen(string& nums)
{
int left = 0;
int right = nums.size()-1;
while(left <= right)
{
if(nums[left] != nums[right])
return false;
left++;
right--;
}
return true;
}
};