回溯演算法 LeetCode 131 分割回文子串

sorry_maker發表於2020-10-24

問題描述

在這裡插入圖片描述

思路

在寫題時,如果題目是要求列舉所有的情況,那麼首先就要考慮遞迴,因為遞迴本身就會回溯,但根據不同的題目,在考慮時,就要注意遞迴的引數是否要和遞迴本身一樣進行回溯,這也是回溯的難點和重點。如果狀態容易儲存,就可以考慮動態規劃的方法來接,但像是本題一樣的要求列舉所有的到的解時,就用回溯法吧。
確定好方法之後,那接下來就是畫出樹狀圖了,然後根據樹狀圖來進行解答。

程式碼

class Solution {
    vector <vector <string>> res; 
    bool isHuiwem(string s) {//這裡就是判斷是否為迴文子串
        for(int i=0;i<s.size()/2;i++) {
            if(s[i]!=s[s.size()-1-i]) return false;
        }
        return true;
    }
    void getPartition(string s,vector <string> p)
    {
        if(s.empty()==true) {
            res.push_back(p);
            return;//這個返回要注意一下
            }
        for(int i=1;i<=s.size();i++) {
            if(isHuiwem(s.substr(0,i))==true) {
                p.push_back(s.substr(0,i));
                getPartition(s.substr(i),p);
                p.pop_back();//這就是回溯的關鍵,在執行上一行操作後,p並不會改變,
                //因為函式呼叫的只是形參,直接根據樹狀圖,就按函式本身代表的意思來解就行了,不用跟著函式跳,,這點很重要
            }
        }
    }
public:
    vector<vector<string>> partition(string s) {
        if(s.size()==0) return res; 
        vector <string> p;
        getPartition(s,p);
        return res;
    }
};

相關文章