【发布时间】:2016-04-09 11:52:11
【问题描述】:
事情是这样的:
给你一个字符串,其元素是方括号( ) [ ] { }。
规则:
每个左括号都有一个对应的右括号。
如果两个括号之间没有任何类型的左括号,则它们形成一对。
一对的右括号必须与左括号相同,例如
()有效,但[)无效。
任务是根据这些标准确定括号字符串是否有效。
示例有效字符串:{}[]()
无效字符串示例:{[}]
这是我的解决方案:
static String braces(String string) {
Stack<String> stack = new Stack<>();
for(int i = 0; i <= string.length() - 1; i ++){
if(string.substring(i, i+1).equals("("))
stack.push((string.substring(i, i+1)));
else if(string.substring(i, i+1).equals("["))
stack.push((string.substring(i, i+1)));
else if(string.substring(i, i+1).equals("{"))
stack.push((string.substring(i, i+1)));
else if(string.substring(i, i+1).equals(")"))
if(stack.peek().equals("("))
stack.pop();
else
return "NO";
else if(string.substring(i, i+1).equals("]"))
if(stack.peek().equals("["))
stack.pop();
else
return "NO";
else if(string.substring(i, i+1).equals("}"))
if(stack.peek().equals("{"))
stack.pop();
else
return "NO";
}
return "YES";
}
根据How to find validity of a string of parentheses, curly brackets and square brackets?的算法完成,如下:
- 维护一堆字符。
- 每当您发现左大括号 '('、'{' 或 '[' 时,将其推到 堆栈。
- 每当您发现右大括号 ')'、'}' 或 ']' 时,检查顶部是否 stack 是对应的左括号,如果是,则弹出堆栈, else 打破循环并返回 false。
- 重复步骤 2 - 3 直到字符串结束。
但我不喜欢它的样子。访问 String 元素的方式有点笨拙,我很好奇是否有另一种更清晰的方法来解决这个问题,也许使用正则表达式?
【问题讨论】:
-
我投票结束这个问题,因为它是关于一般代码改进而不是特定问题。这可能被认为是“主要基于意见”,或者在另一个 Stack Exchange 站点上可能会更好,也许是代码审查。
-
算法看起来不错,唯一的问题是它对每个不是括号的字符执行 6 次测试。也许您可以尝试从之前的字符串中提取所有括号,或者删除所有不是括号的内容。 (但不确定这是否会在所有情况下加速代码)。
标签: java regex string validation brackets