输入字符串中的括号数

时间:2019-07-29 10:31:28

标签: ruby

我输入了字符串

'(p ( g k ) ( m ) )'

我想计算每个嵌套括号的总数    字符

for example output should be for       p -> 1
                                 g and k -> 2
                                       m -> 2

3 个答案:

答案 0 :(得分:2)

使用哈希。

设置:

valid_symbols = ('a'..'z')
counting = {'(' => 1, ')' => -1} # hash to be used for counting
counting.default = 0 # set default to zero
opened = 0 # for tracking opened parenthesys
res = {} # to store the result

计数循环:

str = '(p ( g k ) ( m ) )'

str.chars.each do |ch|
  opened += counting[ch]
  res[ch] = opened if valid_symbols.include? ch
end

res
#=> {"p"=>1, "g"=>2, "k"=>2, "m"=>2}

是的,这是基本概念,可以使用each_with_object等进行重构。

答案 1 :(得分:0)

def nesting(expression)
  current_depth = 0

  expression.
    chars.
    map(&:strip).
    reject(&:empty?).
    each_with_object([]) do |character, nesting|
      if character == '('
        current_depth += 1
      elsif character == ')'
        current_depth -= 1
      else
        nesting.push [character, current_depth]
      end
    end
end

nesting '(p ( g k ) ( m ) )' # => [["p", 1], ["g", 2], ["k", 2], ["m", 2]]

答案 2 :(得分:0)

str = '(p ( g k ) ( m ) )'

count = 0
str.delete(' ').gsub(/\(|\)|[^()]+/).with_object({}) do |s,h|
  case s
  when '(' then count += 1
  when ')' then count -= 1
  else          h[s] = count
  end
end
  #=> {"p"=>1, "gk"=>2, "m"=>2}

它使用String#gsub的形式,当它有一个参数且没有任何块时返回一个枚举数。 1

正则表达式为:“匹配左括号或(|)右括号或除左括号和右括号([^()]+)以外的一个或多个字符。

这假定字符串中的括号是平衡的。可以如下进行测试。

def balanced?(str)
  stack = []
  str.each_char do |s|
    case s
    when '('
      stack << s
    when ')'
      return false if stack.empty? || stack.last == ')'
      stack.pop
    end
  end
  stack.empty?
end

balanced? '(p ( g k ) ( m ) )'    #=> true
balanced? '(p () g k ) (( m ) )'  #=> true
balanced? '(p (( g k )) ( m ) )'  #=> true

balanced? '(p ( g k ) ( m )'      #=> false: 3 '(', 2 ')'
balanced? ')p ( g k ) (( m )'     #=> false: ')' at beginning
balanced? '(p ( g k ))) (( m ) )' #=> false: more ')' than '(' in '(p ( g k )))

1。很少使用gsub这种形式,可能是因为它与字符替换无关;尽管如此,使用简单地生成匹配项的方法还是有用的。它与String#scan相似,不同之处在于该方法的返回值取决于正则表达式是否包含捕获组。 gsub不会受到这种影响。