Leetcode之backtracking

其实backtracking对我来说一直是一个难点。我分析不好,而且脑子会很乱。。

今天遇到了一道题:

Generate Parentheses(LC22 medium)

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:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

这道题明显是要用backtracking做最容易。先上代码:
class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        def generate(current,left,right,result=[]):
            if left>0:
                generate(current+"(",left-1,right)
            if left<right:
                generate(current+")",left,right-1)
            if not right:    result +=current ,
            return result
        return generate("",n,n)

这道题有两个点:1. python中逗号在字符串连接中的使用:

如果两个字符串用“逗号”隔开,那么这两个字符串将被连接,但是,字符串之间会多出一个空格:

‘Jim‘, ‘Green‘ = ‘Jim Green‘

2. backtracking!

对于这道题的backtracking,我用画堆栈的方法分析了一下,看起来很乱,但放上来可以提醒自己下次也用这种方法分析:

关于回溯法:http://blog.csdn.net/tongxinzhazha/article/details/77628450 写的很详细,包括模板示例

分析只是表层的级别,还是要多练才能熟练的写出来。

				
时间: 2024-10-11 20:59:10

Leetcode之backtracking的相关文章

leetcode Ch3-DFS &amp; Backtracking II

一.Gray Code 1 class Solution 2 { 3 public: 4 vector<int> grayCode(int n) 5 { 6 vector<int> result={0}; 7 if(n==0) return result; 8 return dfs(n); 9 } 10 vector<int> dfs(int n) 11 { 12 if(n==1) 13 { 14 vector<int> v={0,1}; 15 return

LeetCode39/40/22/77/17/401/78/51/46/47/79 11道 Backtracking

LeetCode 39 1 class Solution { 2 public: 3 void dfs(int dep, int maxDep, vector<int>& cand, int target) 4 { 5 if (target < 0)return; 6 if (dep == maxDep) 7 { 8 if (target == 0)//到达尾部且等于target 9 { 10 vector<int> temp; 11 for (int i = 0;

Leetcode总结之Backtracking

本文我们就Leetcode中的一个类型的题目backtracking进行一系列的总结和归纳.backtracking这个方法本质是建立在递归的基础上,不断尝试新的路径,这里关键是每次尝试完以后需要退回来也就是回溯. 如果你已经找到了解决方案,那么返回成功 for(现在位置可以的所有可能选择){ 选择其中一个方案然后沿着路径前进一步 使用递归的方法从新的位置解决问题 如果新的位置可以成功解决,向上一级返回成功 从现在位置恢复到循环之前的位置 } 如果到这里表示仍然没有成功,返回失败 下面我们来看一

[Leetcode] Backtracking回溯法解题思路

碎碎念: 最近终于开始刷middle的题了,对于我这个小渣渣确实有点难度,经常一两个小时写出一道题来.在开始写的几道题中,发现大神在discuss中用到回溯法(Backtracking)的概率明显增大.感觉如果要顺利的把题刷下去,必须先要把做的几道题题总结一下. 先放上参考的web: https://segmentfault.com/a/1190000006121957 http://summerisgreen.com/blog/2017-07-07-2017-07-07-算法技巧-backtr

[LeetCode] Backtracking Template for (Subsets, Permutations, and Combination Sum)

根据issac3 用Java总结了backtracking template, 我用他的方法改成了Python. 以下为template. 1 def backtrack(ans, temp, nums, start): # 可能有start, 也可能没有 2 if len(temp) == len(nums): 3 ans.append(temp) 4 else: 5 for i in range(start, len(nums)): 6 if nums[i] not in temp: 7 b

[LeetCode] 90.Subsets II tag: backtracking

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: [1,2,2] Output: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 这个题目思路

leetcode N-Queens/N-Queens II, backtracking, C++

thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for the nice explanation of recursion and backtracking, highly recommended. //N-Queens(12ms) class Solution { vector<vector<string>> ans; int N; //int numofsol; void AddTo_ans

【LeetCode】回溯法 backtracking(共39题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [10]Regular Expression Matching [17]Letter Combinations of a Phone Number [22]Generate Parentheses (2019年2月13日) 给了一个N,生成N对括号的所有情况的字符串. n = 3 [ "((()))", "(()())", "(

【Leetcode】Combinations (Backtracking)

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example, If n = 4 and k = 2, a solution is: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 这是一道经典的NP问题,采用回朔法 i从1开始, 先加入1,再加入2 temp=[1,2] 然后去掉2 加3 temp=[1,3]