leetcode代碼分類彙總之-遞歸

leetcode的遞歸題目彙總。遞歸題目很多,不過有些不分到這個目錄下。


Generate Parentheses:

題目描述:

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"   

這種題目遞歸時妥妥的。

code:

class Solution {
public:
    void rec_gen(vector<string>& ans,int left,int right,int n,string str){
        if(left==n&&right==n){
            ans.push_back(str);
            return;
        }
        if(left<n)
            rec_gen(ans,left+1,right,n,str+"(");
        if(right<left)
            rec_gen(ans,left,right+1,n,str+")");
    }
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        if(n==0) return ans;
        string s;
        rec_gen(ans,0,0,n,s);
        return ans;
    }
};

實際上上面的代碼有效率不高的地方,不過我不指出來了= =!嘻嘻~

Unique Binary Search Trees II:

題目描述:

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3
這個題跟上面的題對比一下,就是我在面試總結之-遞歸算法分析裏面講到的兩種框架,先遞歸還是先處理。這個題是先遞歸,再處理。所以,這個題的遞歸代碼,解是作爲結果return回來的而不是作爲參數傳入。

code:

class Solution {
public:
    vector<TreeNode*> generate(int st,int end){
        vector<TreeNode*> result;
        if(st>end) { result.push_back(NULL); return result;}
        for(int i=st;i<=end;i++){
            vector<TreeNode*> left = generate(st,i-1);   //生成左右子樹
            vector<TreeNode*> right = generate(i+1,end);
            for(int j=0;j<left.size();j++){   //按照所有可能組合方式,以i爲根,組合出一棵樹
                for(int k=0;k<right.size();k++){
                    TreeNode* head = new TreeNode(i);
                    head->left = left[j];
                    head->right = right[k];
                    result.push_back(head);
                }
            }
        }
        return result; //返回結果
    }
    vector<TreeNode *> generateTrees(int n) {
        return generate(1,n);
    }
};


Palindrome Partitioning:

題目描述:

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [
    ["aa","b"],
    ["a","a","b"]
  ]
這個題目也是可以先處理再遞歸的,所以解作爲參數傳入了。(而且這個題目也很容易可以寫成先遞歸,回來再處理,這樣的話解可以作爲返回值)
class Solution {
public:
    bool isPalindrome(string& s,int st,int e){
        for(int i=st,j=e;i<j;i++,j--)
            if(s[i]!=s[j])
                return false;
        return true;
    }
    void rec_part(string& s,int st,vector<vector<string>>& ans,vector<string>& tmp){
        if(st==s.length()){
            ans.push_back(tmp);
            return;
        }
        for(int i=st+1;i<=s.length();i++){
            if(isPalindrome(s,st,i-1)){
                tmp.push_back(s.substr(st,i-st));
                rec_part(s,i,ans,tmp);
                tmp.pop_back();
            }
        }
    }
    vector<vector<string>> partition(string s) {
        vector<vector<string>> ans;
        int len = s.length();
        if(len==0) return ans;
        vector<string> tmp;
        rec_part(s,0,ans,tmp);
        return ans;
    }
};
這個代碼實際上效率很低,應該有不少地方可以優化= =!不過暫時沒有時間,先放上來了,至少是可以過leetcode的大數據的。

====================以後補充的分界線====================以後補充的分界線====================以後補充的分界線==============

發佈了12 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章