1

括弧を検証して、あらゆる種類の文字を囲んで無視できるようにしたいと考えています。文字列を括弧で囲む有効な使用法がある限り、それTrue以外の場合は `False.

私はまだPythonに慣れていないので、この特定の条件に対してifステートメントを適切に作成する方法がわかりません。エラーメッセージを受け取る代わりに.pop()、空のときにdeque()できるようにfi ステートメントを作成しようとしています。return False

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop from an empty deque

おそらく、この問題を解決するための別のより良い方法があります。もしそうなら、他の誰かがそれを解決する方法を見てうれしいです

例えば:

a = 'sdf(sadf(sdf)sdf)sdfsd0sdf)sdf(sdf0)' # false 
b = 'dsf))))(((((dsfsdf' # false
c = '()()()()'  # true
d = '((((asd(asd)asd)()()asd))'   # true

私のコード:

# any letter is ignored
# jsut make sure that the parenthesis are equal

from collections import *

def str_valid(stringy):
    param_stack = deque()
    for n in stringy:
        if n ==')':
            param_stack.pop()
        if n == '(':
            param_stack.append('(')
    if param_stack == []:
        return True
    else:
        return False 

a = 'sdf(sadf(sdf)sdf)sdfsd0sdf)sdf(sdf0)' # false 
b = 'dsf))))(((((dsfsdf' # false
c = '()()()()'  # true
d = '((((asd(asd)asd)()()asd))'   # true

print str_valid(a)

print str_valid(b)

print str_valid(c)

print str_valid(d)
4

6 に答える 6

1

他の人がすでに述べたように、実際にはキューは必要ありません。単純なカウンターで十分です。

def str_valid(txt):
  ctr = 0
  for n in txt:
    if n == '(':
      ctr = ctr + 1
    if n == ')':
      ctr = ctr - 1      
    if ctr < 0:
      return False
  return ctr == 0

または短い:

def str_valid(txt):
  ctr = 0
  for n in txt:
    ctr = ctr + (n == '(') - (n == ')')
    if ctr < 0:
      return False
  return ctr == 0

または「ハッキーな」ワンライナー:)

def str_valid(txt):
  return not reduce(lambda t, c: t if t < 0 else t + (c == '(') - (c == ')'), txt, 0)
于 2013-10-17T05:01:27.917 に答える