力扣 131. 分割回文串

124 阅读1分钟

🔗 leetcode.cn/problems/pa…

题目

  • 给一个字符串 s,对 s 分割成一些子串,每个子串都是回文串
  • 返回所有分割的可能方案

思路

  • 回溯题目的重点,就是设计递归结束的判断,每一轮遍历的时候怎么递归下去,以及递归结束回来之后的处理

  • 本题目的每一轮递归就是

    • 把当前 index 的字符添加到当前的字符串

    • 判断是否为回文,

      • 如果是,则记录,并清空当前字符串,并继续递归
      • 递归结束之后,清除记录,并且恢复当前字符串
    • 不是回文,以及回文递归结束回来之后,递归 index + 1

  • 递归出口是,遍历到 s 的末尾,且当前的字符串为空

代码

class Solution {
public:
    vector<vector<string>> ans;
    bool check(string& s) {
        int n = s.size();
        for (int i = 0; i < s.size() / 2; i++) {
            if (s[i] != s[n - i - 1]) return false;
        }
        return true;
    }
    void dfs(string& s, vector<string>& vec, string& tmp, int index) {
        if (index == s.size()) {
            if (tmp.empty()) ans.push_back(vec);
            return;
        }
        tmp += s[index];
        if (check(tmp)) {
            vec.push_back(tmp);
            tmp.clear();
            dfs(s, vec, tmp, index + 1);
            tmp = vec.back();
            vec.pop_back();
        }
        dfs(s, vec, tmp, index + 1);
    }
    vector<vector<string>> partition(string s) {
        vector<string> vec;
        string tmp;
        dfs(s, vec, tmp, 0);
        return ans;
        
    }
};