Python 刷Leetcode题库,顺带学英语单词(5)

简介: Python 刷Leetcode题库,顺带学英语单词(5)

Valid Parentheses


Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.  [#20]


An input string is valid if:


Open brackets must be closed by the same type of brackets.

Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.


   Example 1:

   Input: "()"

   Output: true

   Example 2:

   Input: "()[]{}"

   Output: true

   Example 3:

   Input: "(]"

   Output: false

   Example 4:

   Input: "([)]"

   Output: false

   Example 5:

   Input: "{[]}"

   Output: true


题意:判断只包含6种括号字符的串中对应的括号是否成对、嵌套是否有效。

用列表模拟先入后出的栈来判断括号是否有效,代码如下:

>>> def ValidParentheses(Parentheses):
  tmp, par = [], '()[]{}'
  for i in Parentheses:
    if i in par[0::2]:
      tmp.append(par[1::2][par[0::2].index(i)])
    elif i in par[1::2]:
      if tmp==[]:
        return False
      elif i!=tmp[-1]:
        break
      else:
        tmp.pop()
    else:
      Parentheses = Parentheses[1:]
  return tmp==[]
>>> inputPar = "()"
>>> ValidParentheses(inputPar)
True
>>> inputPar = "()[]{}"
>>> ValidParentheses(inputPar)
True
>>> inputPar = "(]"
>>> ValidParentheses(inputPar)
False
>>> inputPar = "([)]"
>>> ValidParentheses(inputPar)
False
>>> inputPar = "{[]}"
>>> ValidParentheses(inputPar)
True
>>> 
>>> inputPar ='())([])'
>>> ValidParentheses(inputPar)
False
>>> inputPar = "(3+3/7)*3+((6+2)*(6/2))"
>>> ValidParentheses(inputPar)
True
>>> # 注:函数中用else:Parentheses = Parentheses[1:],已经可以判断不只包含括号的字符串了


Generate Parentheses


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


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


   [

   "((()))",

   "(()())",

   "(())()",

   "()(())",

   "()()()"

   ]


题意:给定数字n,求出 n 对小括号组成的所有嵌套成对有效的组合。

如果不计程序的时间复杂度以及内存空间大小,用排列公式配合本文上一题目中的自定义函数判断就可搞定,代码如下:

>>> from itertools import permutations as perm
>>> n = 3
>>> inputPar = (['('] + [')'])*n
>>> sorted(list({''.join(i) for i in [*perm(inputPar)] if ValidParentheses(''.join(i))}))
['((()))', '(()())', '(())()', '()(())', '()()()']
>>>
>>> 或者:(首先有效字串首尾肯定分别是“(”,"))
>>> n = 3
>>> inputPar = (['('] + [')'])*(n-1)
>>> sorted(list({'('+''.join(i)+')' for i in [*perm(inputPar)] if ValidParentheses('('+''.join(i)+')')}))
['((()))', '(()())', '(())()', '()(())', '()()()']


用以上方法n<7运行没问题;但当n=7时,python报内存错误“MemoryError”。想想14!= 87178291200

正确的解法:

>>> def GenerateParentheses(l,r,par):
  global res
  if l==0 and r==0:
    res.append(par)
    return
  if l>0:
    GenerateParentheses(l-1,r,par+'(')
  if r>0 and l<r:
    GenerateParentheses(l,r-1,par+')')
>>> def ParPairs(n):
  global res
  res = []
  GenerateParentheses(n,n,'')
  return res
>>> ParPairs(3)
['((()))', '(()())', '(())()', '()(())', '()()()']
>>> 


此方法直接运行 ParPairs(n) 算到n=10时也会报“MemoryError”,用个临时变量接收 t=ParPairs(n) 可以算得更多,但n越大就超慢,接近20时也就动不了了。

目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
54 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2
|
26天前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
34 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
30天前
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
17 0
|
30天前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
17 0
|
1月前
|
小程序 IDE 开发工具
Python编写单词复习小程序
Python编写单词复习小程序
|
3月前
|
算法
LeetCode第58题最后一个单词的长度
LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
LeetCode第58题最后一个单词的长度
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
54 7
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
50 3
|
3月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
22 3