更详细的讲解和代码调试演示过程,请参看视频
如何进入google,算法面试技能全面提升指南
在写代码的时候,我们往往遇到一个头疼的问题,例如当我们使用很多if else 语句时,特别是 if else 间套地很厉害使,最容易出现的一个问题是,括号不匹配,你突然之间无法判断当前的右括号到底跟上面的那个括号相匹配。
我们人眼看不出来,但编译器缺失明察秋毫,只要你括号不匹配,那么你就不可能编译的过,这节我们看看,编译器是如何快速的查找到括号不匹配的。
给定一个括号字符串:“()()((())(())”,给定一个算法,判断给定的字符串中括号是否匹配。
选择合适的数据结构就能解决算法问题的三分之二,如果我们使用堆栈解决这个问题,那么问题的难度就大大降低了。
我们的算法设计如下:
1, 变量字符串中的每一个字符。
2, 如果扫描到的字符是左括号’(‘, 则把该字符压入堆栈
3, 如果扫描到的是右括号,‘)’,那么如果此时堆栈为空,表示括号字符串不匹配
4, 如果扫描到的是右括号,并且堆栈不为空,那么弹出堆栈顶部的字符。
5, 当每个括号字符都扫描完毕后,堆栈不为空,那么字符串中的括号不匹配,如果堆栈为空,那么字符串中的括号就匹配。
根据上面的算法步骤,我们可以实现以下编码:
import java.util.Stack;
public class ParentMatcher {
private Stack<Character> stack = new Stack<Character>();
private String parentStr = "";
public ParentMatcher(String parents) {
this.parentStr = parents;
}
public boolean isMatch() throws Exception{
for (int i = 0; i < parentStr.length(); i++) {
if (parentStr.charAt(i) == '(') {
stack.push(parentStr.charAt(i));
} else if (parentStr.charAt(i) == ')') {
if (stack.size() == 0 || stack.pop() != '(') {
return false;
}
} else {
throw new Exception("Illegal character");
}
}
if (stack.size() != 0) {
return false;
}
return true;
}
}
在主入口函数,我们给上面的类输入一个括号字符串,然后看看运行结果:
public class StackAndQuque {
public static void main(String[] args) {
ParentMatcher matcher = new ParentMatcher("((())(())");
try {
System.out.println("The matching result is : " + matcher.isMatch());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由于我们例子中给定的括号字符串是匹配的,因此isMatch()返回结果为true.
我们的算法只需要遍历字符串中的每个字符,因此时间复杂度是O(N), 同时算法并没有申请任何多余内存,因此空间复杂度是O(1).
更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号: