Problem P26. [算法课回溯]分割回文串
做过那么多道回溯题,我才明白回溯的重点难点不是如何遍历全部,而是要回溯到之前的状态,即在一个调用递归的语句后面加上还原回原状态的语句,比如:数组添加了一个元素,然后调用了递归函数,那这个调用语句之后紧接着的应该是数组弹出刚刚添加的元素,这就回溯到了之前的状态。
#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>
#include<string>
using namespace std;
vector<vector<string>> rets;
bool isplalindrome(string s) {
int right = 0, left = s.length()-1;
while(right < left){
if (s[right] == s[left]){
right++;
left--;
}else {
return false;
}
}
return true;
}
void dfs(vector<string>& arr, string s, int idx) {
// 到字符串末尾了,将本次结果记录下来
if (idx == s.length()){
rets.emplace_back(arr);
return;
}
//从index为idx开始截取长度为1,2,3...的子串进行验证,成功则用剩下的部分递归。
for (int i = 1; i <= s.length()-idx; i++){
if (isplalindrome(s.substr(idx, i))){
arr.emplace_back(s.substr(idx, i));
dfs(arr, s, idx+i);
arr.pop_back();
}
}
}
int main()
{
string s;
cin >> s;
vector<string> arr;
dfs(arr, s, 0);
cout << '[';
for (int i = 0; i < rets.size(); i++){
cout << '[';
for (int j = 0; j < rets[i].size(); j++){
cout << rets[i][j];
if (j < rets[i].size()-1){
cout << ", ";
}
}
cout << ']';
if (i < rets.size()-1){
cout << ", ";
}
}
cout << "]";
return 0;
}