括号匹配问题:判断一个字符串是否为有效的括号匹配?
提示:系列括号匹配问题
题目
括号匹配有效的的情况:
有一个左,必然有一个右
每一个左与一个右匹配
问:如何判断一个字符串是有效的括号匹配?
一、审题
示例:()
(())
(()())
下面都不是有效的
(
)()
(()()
从左往右记录左右括号的数量,对消,如果最后无法对冲,那就是有问题
count=0
如果遇到(,count+=
如果遇到),count–
途中要是发现count<0提前说明)多一个,且,左边没法匹配
最后发现count不为0的话,显然没法匹配,不管是)多了,还是(多了
手撕代码:
//复习:
public static boolean isValidReview(String s){
if (s.compareTo("") == 0 || s.length() == 0) return true;
char[] str = s.toCharArray();
int N = str.length;
int count = 0;
for (int i = 0; i < N; i++) {
if (str[i] == '(') count++;
else count--;//遇到)
if (count < 0) return false;//提前说明)过多了
}
return count == 0 ? true : false;//非0false
}
public static void test(){
String s = "())(()))(";//需要补3个
System.out.println(isValid(s));
System.out.println(isValidReview(s));
System.out.println(addNeedBracket(s));
}
public static void main(String[] args) {
test();
}
问题不大:
false
false
总结
提示:重要经验:
1)括号匹配本质就是看左右括号的数量是否一直,而且,)有括号还不能提前多出现!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。