leetcode - 刷题记录-探索中级算法-回溯算法

  1. 电话号码的字母组合
    1. 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

      给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    2. class Solution:
          def letterCombinations(self, digits: str) -> List[str]:
              dic = {'2':['a','b','c'],
                     '3':['d','e','f'],
                     '4':['g','h','i'],
                     '5':['j','k','l'],
                     '6':['m','n','o'],
                     '7':['p','q','r','s'],
                     '8':['t','u','v'],
                     '9':['w','x','y','z']
                    }
              if len(digits) == 0:
                  return []
              elif len(digits) == 1:
                  return dic[digits[0]]
              else:
                  res = []
                  tmp = self.letterCombinations(digits[1:]) 
                  for ch in dic[digits[0]]:
                      for strs in tmp:
                          res.append(ch+strs)
                  return res

      通过

  2. 生成括号

    1. 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

    2. class Solution:
          def generateParenthesis(self, n: int) -> List[str]:
              if n == 0:
                  return [""]
              elif n == 1:
                  return ["()"]
              elif n == 2:
                  return ["(())","()()"]
              else:
                  res = []
                  for i in range(n):
                      j = n - i - 1
                      left = self.generateParenthesis(i)
                      right = self.generateParenthesis(j)
                      #print(['({}){}'.format(l,r) for l in left for r in right])
                      res.extend(['({}){}'.format(l,r) for l in left for r in right])
                      print(i,j,res)
                  return res

      通过,这个题比较难理解

  3. 全排列

    1. 给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    2. class Solution:
          def permute(self, nums: List[int]) -> List[List[int]]:
              if len(nums) == 0:
                  return []
              elif len(nums) == 1:
                  return [nums]
              elif len(nums) == 2:
                  return [nums,nums[::-1]]
              else:
                  res = []
                  tmp = self.permute(nums[:-1])
                  for i in tmp:
                      for j in range(len(nums)):
                          res.append(i[:j]+[nums[-1]]+i[j:])
                  return res

      通过

  4. 子集

    1. 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

      说明:解集不能包含重复的子集。

    2. class Solution:
          def subsets(self, nums: List[int]) -> List[List[int]]:
              if len(nums) == 0:
                  return [[]]
              elif len(nums) == 1:
                  return [[],nums]
              else:
                  tmp = self.subsets(nums[:-1])
                  res = []
                  for i in tmp:
                      res.append(i.copy())
                      i.append(nums[-1])
                      res.append(i)          
                  return res

      通过

  5. 单词搜索

    1. 给定一个二维网格和一个单词,找出该单词是否存在于网格中。

      单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

发布了45 篇原创文章 · 获赞 1 · 访问量 8553

猜你喜欢

转载自blog.csdn.net/qq_32110859/article/details/105217164
今日推荐