从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个字符串 s,请你将 **s **分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入: s = "aab"
输出: [["a","a","b"],["aa","b"]]
示例 2:
输入: s = "a"
输出: [["a"]]
提示:
1 <= s.length <= 16s仅由小写英文字母组成
二、思路分析
这个题目让人比较困惑的就是字符串该如何分割,或者说分割应该怎么表示出来;然后就是如何在递归循环中截取子串。
我是用startindex来表示每次分割到哪里了。前面的题目中也使用过startindex,但还是让人有些糊涂。而且,在循环中需要截取符合要求的字符串,这需要两个参数,一个前一个后,仅仅只有一个startindex显然是没办法截取的。那另一个参数该是什么呢
最后就是判断该字符串是否是回文?这个用一个函数就可以验证。然后在for循环里,截取字符串的范围为[startindex,i]。接着就判断该截取的字符串是否为回文字符串,如果是的话,则通过backtracking进行递归,传入的参数startindex为i+1.不是的话则通过continue语句跳出该次循环,进行下一次循环。
三、AC代码
public:
vector<string>path;
vector<vector<string>>ans;
bool judgehuiwen(string s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(s[i]!=s[j]){
return false;
}
}
return true;
}
void backtracking(string s,int startindex){
if(startindex>=s.size()){
ans.push_back(path);
return;
}
for(int i=startindex;i<s.size();i++){
if(judgehuiwen(s,startindex,i)){
string temp=s.substr(startindex,i-startindex+1);
path.push_back(temp);
}
else{
continue;
}
backtracking(s,i+1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return ans;
}
};
四、总结
很有一些难度,让人困惑