我输入了字符串
'(p ( g k ) ( m ) )'
我想计算每个嵌套括号的总数 字符
for example output should be for p -> 1
g and k -> 2
m -> 2
答案 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
不会受到这种影响。