Item
编写一个函数,该函数接受一串括号,并确定括号的顺序是否有效。 如果字符串有效,函数应该返回 true,如果字符串无效,则返回 false。
除了左括号(和右括号)外,输入还可以包含任何有效的 ASCII 字符。 此外,输入字符串可能为空和/或根本不包含任何括号。不要将其他形式的括号视为圆括号(例如 []、{}、<>)。
题目来源:Codewars(5kyu)
题目原文:Write a function that takes a string of parentheses, and determines if the order of the parentheses is valid. The function should return true if the string is valid, and false if it’s invalid.
0 <= input.length <= 100
Along with opening (() and closing ()) parenthesis, input may contain any valid ASCII characters. Furthermore, the input string may be empty and/or not contain any parentheses at all. Do not treat other forms of brackets as parentheses (e.g. [], {}, <>).
Example
“()” => true
“)(()))” => false
“(” => false
“(())((()())())” => true
Knowledge
- 数据类型:字符串
- 运算符:赋值运算符、比较运算符
- 容器:列表
- 其他:For循环体、While循环体、list.count()方法、enumerate(list)函数
Parsing
- 提取仅包含左右且半角状态下的括号组成列表,此处设为列表1;
- enumerate函数处理该列表,包含了索引和值的索引序列;
- 通过第二步的处理,for-if提取所有左括号的索引列表,此处设为列表2;
- 接下来重点部分:仔细分析列表1,发现左右括号如果正确嵌套即符合题意时,以一个左括号来论,那么只有相对它或者与他间隔偶数个位置才能找到一个与之配对的括号,此处讲解比较抽象,举个例子:
【 ( ( ) ( ) ) ( )】以第一左括号为例,则偶数个间隔,即第6个与之对应,当然还有一种符合题意的情况,该左括号往右的首个括号与它配对。 - 特点已经找出来了,符合题意无非两种条件,第一是相邻配对,第二是间隔偶数配对。
- 通过左括号的索引即列表2,相对索引位置,获取是否存在括号匹配;
- 判断依据就设定一个变量c,初试值为0,每查到一个左括号有一个右括号与之匹配,则自加1,那么很容易理解,符合题意的列表长度是偶数,长度的一半即是变量c最终的值,c符合该值,即返回True,反之返回False
- 此题对我这个编程初学者来说算是略难,,略有小小的感悟:遭遇问题不可盲目解决,得先去分析特点,再去落实问题!
Code
def valid_parentheses(string):
brackets = [eStr for eStr in string if eStr == "(" or eStr == ")"]
c = 0
for g in [i for i,x in enumerate(brackets) if x == "("]:
j = 1
while g+2*j-1 < len(brackets):
if brackets[g] != brackets[g+1] or brackets[g] != brackets[g+2*j-1]:
c += 1
break
j += 1
if c == len(brackets)/2 and brackets.count("(") == brackets.count(")"):
return True
else:
return False