【LeetCode-回溯】分割回文串

题目描述

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。
示例:

输入: "aab"
输出:
[
  ["aa","b"],
  ["a","a","b"]
]

题目链接: https://leetcode-cn.com/problems/palindrome-partitioning/

思路

由于是求所有可能分割情况,所以使用回溯来做。代码如下:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        if(s.empty()) return {};

        vector<vector<string>> ans;
        vector<string> cur;
        int start = 0;
        dfs(s, start, cur, ans);
        return ans;
    }

    void dfs(string s, int start, vector<string> cur, vector<vector<string>>& ans){
        if(start>=s.size()){
            ans.push_back(cur);
            return;
        }

        for(int i=start; i<s.size(); i++){
            string sub = s.substr(start, i-start+1);
            if(judge(sub)){
                cur.push_back(sub);
                dfs(s, i+1, cur, ans);
                cur.pop_back();
            }
        }
    }

    /*判断s是否是回文串,是返回true,不是返回false*/
    bool judge(string s){
        if(s.size()==1) return true;
        int left = 0;
        int right = s.size()-1;
        while(left<right){
            if(s[left]!=s[right]) return false;
            left++;
            right--;
        }
        return true;
    }
};

使用下面的写法(多加了几个引用&)可以将速度提升 4 倍:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        if(s.empty()) return {};

        vector<string> cur;
        vector<vector<string>> ans;
        int start = 0;
        dfs(s, start, cur, ans);
        return ans;
    }

    void dfs(string& s, int start, vector<string>& cur, vector<vector<string>>& ans){
        if(start>=s.size()){
            ans.push_back(cur);
            return;
        }

        for(int i=start; i<s.size(); i++){
            string sub = s.substr(start, i-start+1);
            if(judge(sub)){
                cur.push_back(sub);
                dfs(s, i+1, cur, ans);
                cur.pop_back();
            }
        }
    }

    /*判断s是否是回文串,是返回true,不是返回false*/
    bool judge(string& s){
        if(s.size()==1) return true;
        int left = 0;
        int right = s.size()-1;
        while(left<right){
            if(s[left]!=s[right]) return false;
            left++;
            right--;
        }
        return true;
    }
};
posted @ 2020-07-11 21:30  Flix  阅读(135)  评论(0编辑  收藏  举报