【问题标题】:Detecting bad syntax in a string [duplicate]检测字符串中的错误语法[重复]
【发布时间】:2014-07-28 04:09:22
【问题描述】:

我刚刚完成了第一次面试编码测验,我正处于沉浸在 dran-o 浴缸和投资 No Tears 泡泡浴产品以及一堆烤面包机之间。

问题如下:

如果给你一个像"zx(c)abcde[z{x]}" 这样的字符串,编写一个函数,如果语法正确则返回true,如果语法不正确则返回false:例如,在该字符串中,括号和大括号被弄乱了。换句话说,"{hello}mot[o]" 会通过,但"{hello}mo{[t}" 不会。

我的整个过程是这样的:保留一个打开和关闭括号/大括号/括号位置的列表,然后查看是否有重叠。但这不是最佳解决方案,所以我轰炸了它。

我需要一些帮助来了解如何解决这个问题。

提前致谢。

【问题讨论】:

  • 您是如何跟踪他们的位置的?这可以归结为您如何评估中缀表达式。当你遇到右括号时,只需将开括号推入堆栈并弹出,最后检查堆栈是否为空
  • @noMAD 你能解释一下这个答案吗?我的脑海里有类似的事情,但我完全僵住了,感觉自己得了动脉瘤

标签: ruby string parsing syntax


【解决方案1】:

[编辑:我认为这个问题似乎很熟悉。我和其他几个人不久前回答了它。]

另一种方法是先去除不相关的字符,然后依次删除相邻的匹配对,直到字符串为空(返回true)或字符串不为空且没有更多匹配的相邻对(返回false)。

def check_for_match(str)
  str = str.gsub(/[^\(\)\[\]\{\}]/, '')
  while str.gsub!(/\(\)|\[\]|\{\}/, ''); end
  str.empty?
end

check_for_match("zx(c)abcde[z{x]}") #=> false
check_for_match("zx(c)abcde[z{x}]") #=> true

读者挑战:在返回false 时提供语法不正确的证明。

【讨论】:

    【解决方案2】:

    [编辑:我已经采纳了@sawa 的两个出色建议。]

    一种方法是使用堆栈。

    MATCH   = { '['=>']', '('=>')', '{'=>'}' }
    OPENING = MATCH.keys
    CLOSING = MATCH.values
    
    def check_for_match(str)
      str.chars.each_with_object([]) do |c, arr|
        case c
        when *OPENING
          arr << c
        when *CLOSING
          return false unless c.eql?(MATCH[arr.pop])
        end
      end.empty?
    end
    
    check_for_match("zx(c)abcde[z{x]}") #=> false
    check_for_match("zx(c)abcde[z{x}]") #=> true
    

    【讨论】:

    • @meagar,我认为我们同时进行了相同的编辑,但谢谢!
    • case c; when *OPENING; ...; when *CLOSING; ... 会更好。
    • 您也可以将return false if (arr.empty? or (c != MATCH[arr.last])); arr.pop简化为return false unless c == MATCH[arr.pop]
    • 不应该是c = MATCH[arr.pop],而是c == MATCH[arr.pop]
    • 你能解释一下 * 在 OPENING 和 CLOSING 之前的作用吗?以前从未见过。
    【解决方案3】:

    我会用 XML 标记替换每个括号,然后通过 XML 验证器运行它。它会挑选出像这样奇怪的东西:

    <bracket>stuff<curly>morestuff</bracket></curly>
    

    这将导致 XML 验证失败,因此您可以直接返回。

    【讨论】:

    • 一个 XML 验证器绝对是 大量 过大的杀伤力,并且对于这样一个简单的问题非常依赖。
    • 好吧,公平地说,这是一场面试考试,这会引起人们的注意。 :) 我意识到使用 XML 验证器是非常过分的,但归根结底,它需要可靠、快速且没有疯狂调试的工作和工作。我无法想象 RegEx 更容易调试......运行 XML 验证器比调试 RegEx IMO 更容易。
    • 说实话,我个人会使用 RegEx 解决方案 :) 但是 XML 验证器比其他方法有更多的测试支持,因为 W3C 不会让这样的事情溜走,而且它有大量的可信度。
    猜你喜欢
    • 2017-06-24
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2013-05-27
    相关资源
    最近更新 更多