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;
}

posted @ 2022-10-11 15:10  白缺  阅读(45)  评论(0编辑  收藏  举报