LeetCode 17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
class Solution:
def go(self,n,_th,digits,res):
if n == 0:
self.ans.append(res)
return
x = self.map_c[digits[_th]]
for i in x:
self.go(n-1,_th+1,digits,res+i)
def letterCombinations(self, digits: str) -> List[str]:
self.map_c={
'2':'abc',
'3':'def',
'4':'ghi',
'5':'jkl',
'6':'mno',
'7':'pqrs',
'8':'tuv',
'9':'wxyz',
}
self.ans = []
self.digits = digits
n = len(digits)
if n == 0:
return []
self.go(n,0,digits,'')
return self.ans
LeetCode 22.括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
class Solution:
def go(self,n,left,right,res):
if left == right and left == n:
self.ans.append(res)
return
if left < n:
self.go(n,left+1,right,res+'(')
if left > right and right < n:
self.go(n,left,right+1,res+')')
def generateParenthesis(self, n: int) -> List[str]:
self.ans=[]
self.go(n,0,0,'')
return self.ans
这两道题都是用DFS的算法递归求出的,思路有点类似于八皇后问题。 DFS+剪枝。
其中括号生成那道题感觉比电话号码生成难,难就难在,判断(剪枝)的条件自己弄不出来。
其实是:1.每次右括号加之前必须要保证左括号的数量要多于右括号,才能确定加这次的右括号,
2.左右括号的数量最终都应是n,最终形成的整个字符串的长度是2n.
3.错误的生成括号组合,就是因为在局部内右括号多余左括号了,这样就会导致错误。