首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查Ruby中闭括号、括号或括号的有效性

如何检查Ruby中闭括号、括号或括号的有效性
EN

Stack Overflow用户
提问于 2013-12-23 16:22:55
回答 5查看 6.9K关注 0票数 13

编写一个方法'valid_string?‘接受一个字符串。如果括号、括号和大括号正确关闭,则返回true。否则它会返回false。

代码语言:javascript
运行
复制
valid_string?("[ ]")                  # returns true
valid_string?("[  ")                  # returns false
valid_string?("[ ( text ) {} ]")      # returns true
valid_string?("[ ( text { ) } ]")     # returns false

我的代码:一切都是假的。甚至尝试在个别情况下使用显式布尔值,{} AC.26 () \x,等,都没有起作用。对所有内容都返回true或false。是我的司机密码吗?

代码语言:javascript
运行
复制
def valid_string?(str) 

    if str == ("\[\s+]")
        true
    else
        false
    end
end

更新的SOLUTION:------------------------------------------------是的!#匹配肯定更好!虽然我的最后一行测试代码正在计算为true。当它应该是假的。。。

代码语言:javascript
运行
复制
def valid_string?(str) 
if str.match "(\\[.+\\])" || "|(\\(\\))" || "|({})"
    return true
else
    return false
    end
end

puts valid_string?("[ ]")                  # returns true
puts valid_string?("[  ")                  # returns false
puts valid_string?("[ ( text ) {} ]")      # returns true
puts valid_string?("[ ( text { ) } ]")     # returns false
EN

回答 5

Stack Overflow用户

发布于 2013-12-23 16:29:10

我认为使用regex解决这个问题可能比较复杂。这里有一个潜在的解决方案:您可以使用堆栈在遍历中记录左边的符号,如{[(。每次遇到正确的符号时,只需检查堆栈顶部的符号是否与此正确的符号匹配。如果不匹配,只需返回false

下面是我的代码:

代码语言:javascript
运行
复制
def valid_string?(str)
  stack = []
  symbols = { '{' => '}', '[' => ']', '(' => ')' }
  str.each_char do |c|
    stack << c if symbols.key?(c)
    return false if symbols.key(c) && symbols.key(c) != stack.pop
  end
  stack.empty?
end

puts valid_string?('[ ]')                  # returns true
puts valid_string?('[  ')                  # returns false
puts valid_string?('[ ( text ) {} ]')      # returns true
puts valid_string?('[ ( text { ) } ]')     # returns false
票数 11
EN

Stack Overflow用户

发布于 2013-12-23 22:08:57

仅仅因为它很有趣,我就着手解决了这个-- Ruby :)

代码语言:javascript
运行
复制
class Brackets
  class Bracket
    def initialize(open, close)
      @open = open
      @close = close
      @match_count = 0
    end
    attr_reader :match_count, :open, :close

    def check(c)
      @match_count += 1 if c == @open
      @match_count -= 1 if c == @close
    end
  end

  def initialize
    @brackets = []
    @stack = []
    @valid = true
  end

  def add(open, close)
    @brackets << Bracket.new(open,close)
  end

  def check(c)
    @brackets.each do |b|
      b.check(c)
      @stack.push(c) if c == b.open
      @valid = false if c == b.close and @stack.pop != b.open
    end
  end

  def valid?
    total = 0
    @brackets.each { |b| total += b.match_count }
    total == 0 && @valid == true
  end
end

def valid_string?(str)
  brackets = Brackets.new
  brackets.add('[', ']')
  brackets.add('{', '}')
  brackets.add('(', ')')

  str.each_char { |c| brackets.check(c) }
  brackets.valid?
end

# Our tests
puts valid_string?("[ ]") ? 'true' : 'false'                 # returns true
puts valid_string?("[  ") ? 'true' : 'false'                 # returns false
puts valid_string?("[ ( text ) {} ]") ? 'true' : 'false'     # returns true
puts valid_string?("[ ( text { ) } ]") ? 'true' : 'false'    # returns false
puts valid_string?("[ ( text { } ) ]") ? 'true' : 'false'    # returns true
票数 6
EN

Stack Overflow用户

发布于 2013-12-23 18:13:34

这里有一种不使用regex的方法:

代码语言:javascript
运行
复制
def valid_string?(str)
  strim = str.gsub(/[^\[\]\(\)\{\}]/,'')
  return true if strim.empty?
  return false if strim.size.odd?
  loop do  
    s = strim.gsub('()','').gsub('[]','').gsub('{}','')
    return true if s.empty?
    return false if s == strim
    strim = s
  end   
end

p valid_string?("[ ]")               # => true
p valid_string?("[  ")               # => false
p valid_string?("[ ( text ) {} ]")   # => true
p valid_string?("[ ( text { ) } ]")  # => false
p valid_string?("[ ( text { more text { (more text) }} )]")  # => true
  • 首先移除"()[]{}“中的所有字符。
  • 如果其余字符串为空,则返回true。
  • 如果其余字符串包含奇数字符,则返回false。
  • 继续删除相邻的对“()”、“[]”和“[]”,直到字符串为空为止,在这种情况下返回true,或者不再删除相邻的对,字符串是非空的,在这种情况下返回false。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20747294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档