给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是
回文串
。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
思路,我们可以采用回溯算法,找到每一个字符串的组合,再判断是否是回文串,在回溯函数中,我们采用一个for循环更新容器大小用来截取字符串长度。
class Solution {
public:vector<vector<string>>res;vector<string>path;bool is_fun(int left,int right,string s){if(left>right)return false;while(left<right){if(s[left]!=s[right])return false;left++;right--;}return true;}void backtracing(int left,int right,string s){if(left>right){res.push_back(path);return ;}for(int i=0;i<right-left+1;i++){if(is_fun(left,left+i,s)){path.push_back(s.substr(left,i+1));backtracing(left+i+1,right,s);path.pop_back();}}}vector<vector<string>> partition(string s) {backtracing(0,s.size()-1,s);return res;}
};
给定字符串大小除去上面方法外,我们还可以使用substr函数,我认为这样写更加清晰,在判断是否是回文串时可以直接重新计算字符串的left和right,像上面函数中写的,在调用is_fun函数时,我第一次写时传错参数is_fun(left.i,s)导致开头传错判断错误。
for(int i=1;i<=right-left+1;i++){if(is_fun(s.substr(left,i))){path.push_back(s.substr(left,i));backtracing(left+i,right,s);path.pop_back();}