dp括号匹配 网易面试题
这是较容易的编码任务之一,但是您仍然可以在一些初步的技术筛选中达到目标。 问题看起来像这样:
给定仅包含字符
'('
,')'
,'{'
,'}'
,'['
和']'
的字符串,请确定输入字符串是否有效。括号必须以正确的顺序闭合,
"()"
和"()[]{}"
均有效,而"(]"
和"([)]"
则无效。描述取自Leetcode(c) 。
您如何解决?
我们一直在使用这项任务进行技术筛选。 有趣的是,有多少人真的不知道该如何处理(请注意,这是Leetcode上的“轻松”类别)。 有些人尝试使用正则表达式。 有些人试图想出一种蛮力解决方案,遍历字符串并计算开括号和闭括号。 但是,如果您考虑一下,您将理解,两者都不足以。 例如,如何在最简单的([)]情况下计数帮助?
您应该想到的解决方案是stack ,但是如果您从未接受过解决编码问题的培训,则可能不会。 为什么要堆叠? 好吧,因为只有当您看到闭合的支架时,才可以检查一对支架或支架的完整性。 但这意味着打开的那个应该放在某个地方等待,并在某些数据结构之上进行检查。 允许LIFO访问的结构是一个堆栈 。 碰巧我们在Java中有一个现成的Stack类 。
那么,简单的解决方案如何?
基本思想是,您开始遍历字符串。 如果符号是打开符号之一,则将其推入堆栈。 如果即将关闭,您可以查看堆栈,看看是否匹配。 如果是,则将其从堆栈中弹出。 如果堆栈最后为空,则返回true。
import java.util.*;public class Groups{private static final List<Character> OPEN = Arrays.asList('(', '{', '[');private static final List<Character> CLOSE = Arrays.asList(')', '}', ']');public static boolean groupCheck(String s){if (s == null || s.length() == 0) {return true;}Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char current = s.charAt(i);if (isOpen(current)) {stack.push(current);} else {if (stack.isEmpty()) {return false;}char prev = stack.peek();if (isMatch(prev, current)) {stack.pop();}}}return stack.isEmpty();}private static boolean isOpen(char c) {return OPEN.contains(c);}private static boolean isClose(char c) {return CLOSE.contains(c);}private static boolean isMatch(char prev, char next) {return isOpen(prev) && (OPEN.indexOf(prev) == CLOSE.indexOf(next));}}
还有其他解决方法吗? 如果您没有想到堆栈怎么办? 与往常一样,有多种方法可以解决问题。 让我们看这个例子: ([]){} 。
让我们尝试替换正确匹配的对:
“([[]){}”。replace(“ []”,“”)=>“(){}”。replace(“(()”,“”)=>“ {}”。replace(“ {} ”,“”)=>“”
因此,我们可以循环遍历字符串,用空字符串替换“ {}”,“()”和“ []”。 当结果为空时,表示所有对都匹配。 如果没有变空怎么办? 我们如何摆脱周期? 好吧,我们需要检查一轮替换后字符串的长度是否已更改。 如果还没有,那么我们就破产了。
public class Groups{public static boolean groupCheck(String s) {int len;do {len = s.length();s = s.replace("()", "");s = s.replace("{}", "");s = s.replace("[]", "");} while (len != s.length());return s.length() == 0;}
}
看起来更好。 简单易读,但实际上是否更好? 我会说不,不是。 为什么? 好吧,因为String类是不可变的 ,因此每次执行s.replace()时,我们都会在堆上创建一个新的字符串对象。
那么,如何最好地做到这一点呢? 我们可以使用StringBuilder类重写代码吗? 好吧,不是直接的,因为它没有replaceAll方法。 您必须使用现有的replace方法自己编写它。 Apache Commons库中有一个StrBuilder类,它确实具有此方法,但它不是标准的Java类,您必须添加一个依赖项。
因此,即使这个简单的任务也可以给您一些思考。 但是,对于面试,任何解决方案都可以。 如果堆栈不是您脑海中最先想到的,那么您可以不做任何事情。
翻译自: https://www.javacodegeeks.com/2017/02/interview-questions-verify-braces.html
dp括号匹配 网易面试题