我刚刚第一次接受了这些采访编码测验,而且我介入的是将自己淹没在一个dran-o和投资No Tears泡泡浴产品以及一堆烤面包机之间。
问题如下:
如果给你一个像"zx(c)abcde[z{x]}"
的字符串,写一个函数,如果语法正确则返回true,如果语法不正确则返回false:例如,在该字符串中,括号和大括号混乱。换句话说,"{hello}mot[o]"
会通过但"{hello}mo{[t}"
不会通过。
我的整个过程如下:保持开始和结束括号/括号/ parens位置列表,然后查看是否有重叠。但那不是最佳解决方案,所以我对它进行了轰炸。
我想了解如何解决这个问题。
提前致谢。
答案 0 :(得分:5)
[编辑:我已经纳入了@ 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
答案 1 :(得分:2)
另一种方法是首先删除不相关的字符,然后依次删除相邻的匹配对,直到字符串为空(返回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 :(得分:1)
我会用XML标记替换每个括号,然后通过XML验证器运行它。它会选择这样奇怪的东西:
<bracket>stuff<curly>morestuff</bracket></curly>
这将使XML验证失败,因此您可以将其返回。