Ruby 输入字符串中的括号数

Ruby 输入字符串中的括号数,ruby,Ruby,我有输入字符串 '(p ( g k ) ( m ) )' 我想计算每个圆的嵌套括号总数 性格 for example output should be for p -> 1 g and k -> 2 m -> 2 def嵌套(表达式) 当前深度=0 表情。 查斯。 地图(&:strip)。 拒绝(&:空?)。 每个带有_

我有输入字符串

'(p ( g k ) ( m ) )'
我想计算每个圆的嵌套括号总数 性格

for example output should be for       p -> 1
                                 g and k -> 2
                                       m -> 2
def嵌套(表达式)
当前深度=0
表情。
查斯。
地图(&:strip)。
拒绝(&:空?)。
每个带有_对象([])的|字符,嵌套|
如果字符=='('
当前_深度+=1
elsif字符==')'
当前_深度-=1
其他的
nesting.push[字符,当前深度]
结束
结束
结束
嵌套“(p(gk)(m))”#=>[“p”,1],“g”,2],“k”,2],“m”,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}
是的,这是基本思想,并且可以使用
每个带有\u对象的\u
等进行重构

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

当它有一个参数且没有块时,它使用返回枚举数的形式。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

1.这种形式的
gsub
很少使用,可能是因为它与字符替换无关;不过,有一个简单生成匹配项的方法可能很有用。它类似于
String#scan
,但该方法的返回值取决于正则表达式是否包含捕获组;
gsub
不会以这种方式受到影响。

请向我们展示您已经尝试过的内容。抱歉,我找不到这个答案。我试图找到括号的最大深度,但这对我不起作用。为什么
m->1
?它完全嵌套了2次。“这对我不起作用。”“这不是一个足够精确的错误描述,我们无法帮助您。什么不起作用?它怎么不起作用?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?此外,请提供一份。
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 )))