初见Python解题之道(十二)

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

  1. 数据类型:字符串
  2. 运算符:赋值运算符、比较运算符
  3. 容器:列表
  4. 其他:For循环体、While循环体、list.count()方法、enumerate(list)函数

Parsing

  1. 提取仅包含左右且半角状态下的括号组成列表,此处设为列表1;
  2. enumerate函数处理该列表,包含了索引和值的索引序列;
  3. 通过第二步的处理,for-if提取所有左括号的索引列表,此处设为列表2;
  4. 接下来重点部分:仔细分析列表1,发现左右括号如果正确嵌套即符合题意时,以一个左括号来论,那么只有相对它或者与他间隔偶数个位置才能找到一个与之配对的括号,此处讲解比较抽象,举个例子:
      【 ( ( ) ( ) ) ( )】以第一左括号为例,则偶数个间隔,即第6个与之对应,当然还有一种符合题意的情况,该左括号往右的首个括号与它配对。
  5. 特点已经找出来了,符合题意无非两种条件,第一是相邻配对,第二是间隔偶数配对。
  6. 通过左括号的索引即列表2,相对索引位置,获取是否存在括号匹配;
  7. 判断依据就设定一个变量c,初试值为0,每查到一个左括号有一个右括号与之匹配,则自加1,那么很容易理解,符合题意的列表长度是偶数,长度的一半即是变量c最终的值,c符合该值,即返回True,反之返回False
  8. 此题对我这个编程初学者来说算是略难,,略有小小的感悟:遭遇问题不可盲目解决,得先去分析特点,再去落实问题!

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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾平安6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值