Итак, я пытаюсь решить задачу, в которой, если перены находятся в правильном порядке, я возвращаю истину; иначе, конечно, ложь. Код, который я придумал, находится здесь:

def valid_parentheses(str)
    return false if str.length % 2 == 1
        begin
            eval(str)
        rescue SyntaxError
            false
        else
            true
        end
    end
end

Работает как чудо, за исключением ситуаций вроде valid_parentheses("hi(hi)()"), который должен возвращать # => true, но вместо этого возвращает false, потому что окончание () не требует кавычек и, следовательно, вызывает ошибку.

Я пытался разделить его скобками, но:

str.split(/\(.*\))
# =>"hi"

Потому что он удалил все скобки и:

str.scan(/\(.*\))
#=> "(hi)()"

Потому что технически он все еще начинается с ( и заканчивается ).

Как мне разделить это, чтобы получить "(hi)" и "()" по отдельности?

-1
Andrea McKenzie 28 Фев 2016 в 01:02

2 ответа

Лучший ответ

Есть несколько способов сделать это. Один из них - сначала удалить все символы, кроме "(" и ")", затем в цикле удалить подстроки "()", продолжая до тех пор, пока больше таких пар не удастся удалить. Если строка пуста, то парные скобки сбалансированы; иначе их нет.

def balanced_parens?(str)
  pstr = str.gsub(/[^()]/,"")
  puts "pstr=#{pstr}"
  while pstr.gsub!("()", "")
  end
  pstr.empty?
end

balanced_parens? "Now (is(the(time)to(have(fun)))fun)"
  #=> true
balanced_parens? "Now (is(the)time)to(have)fun)((fun)"
  #=> false

Вот пошаговые инструкции для этих двух строк:

str = "Now (is(the(time)to(have(fun)))fun)"
pstr = str.gsub(/[^()]/,"")
  #=> "((()(())))" 
pstr.gsub!("()", "")
  #=> "((()))" 
pstr.gsub!("()", "")
  #=> "(())" 
pstr.gsub!("()", "")
  #=> "()" 
pstr.gsub!("()", "")
  #=> "" 
pstr.gsub!("()", "")
  #=> nil 
pstr.empty?
  #=> true

str = "Now (is(the)time)to(have)fun)((fun)"
pstr = str.gsub(/[^()]/,"")
  #=> "(())())(()" 
pstr.gsub!("()", "")
  #=> "())(" 
pstr.gsub!("()", "")
  #=> ")(" 
pstr.gsub!("()", "")
  #=> nil 
pstr.empty?
  #=> false
0
Cary Swoveland 29 Фев 2016 в 06:15

Вы рассматривали возможность использования регулярного выражения? Что-то вроде:

/hay/ =~ 'haystack'   #=> 0
/y/.match('haystack') #=> #<MatchData "y">

Может работать.

-1
vibration 27 Фев 2016 в 22:16