题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断该字符串是否有效。
有效字符串需满足:
a左括号必须用相同类型的右括号闭合。
b左括号必须以正确的顺序闭合。
比如: "()"、"()[]{}"、"{[]}" 都是有效字符串,而 "(]" 、"([)]" 则不是。
解题思路:
根据题目描述可以知道,在遍历字符串的过程中,第一个遇到的一定是左括号,后续元素有两种可能:
a:还是左括号
b:与已遍历元素相匹配的右括号
那么只需要在遍历过程中,将左括号存放到栈中,并判断遍历到的右括号是否与当前栈顶元素相匹配,若匹配则该栈顶弹出,否则继续遍历。
而判断是否匹配的过程,即为判断当前括号是否和栈顶元素对应,因此可以将括号的对应规则存入Map集合,令左括号为键,右括号为值,每一次遇到右括号的判断,都是判断当前左括号在Map集合中对应的值是否与遍历到的右括号相等。
举个例子:{( [ ] )}
上述字符串是一个有效字符串
在遍历过程中 左括号{ ( [ 依次入栈,此时栈顶元素为 [
继续遍历,]为右括号,此时,需要判断栈中是否有元素,若栈中没有元素,说明该右括号为单独的的右括号,匹配失败, 若有元素,判断该括号与栈顶是否匹配,若匹配,故栈顶元素 [ 弹出
继续遍历直至字符串遍历结束,栈顶左括号全部弹出,循环结束,匹配成功。否则失败
判断函数
public static boolean check(Map<Character,Character> map,String str){
Set<Character> keys=map.keySet();
Stack<Character> stack = new Stack<>();
for(int i=0,len=str.length();i<len;i++){
//若为左括号则压栈
if(str.charAt(i)=='('||str.charAt(i)=='{'||str.charAt(i)=='['){
stack.push(str.charAt(i));
}else{
/*若为右括号,则判断是否匹配
*此时需要判断当前栈是否为空栈,这是因为遍历还在继续。如果是空栈则说明,有单独的右括号,返回false
* 若不是空栈,则与map集合中的规则进行比较,当该元素是栈顶所匹配的右括号时,栈顶弹出,继续向后遍历
* */
if(stack.size()>0){
if (str.charAt(i)==map.get(stack.peek())){
stack.pop();
}
}else{
return false;
}
}
}
//遍历结束,栈为空,表示所有左括号都匹配成功并弹出,返回true
if (stack.size()==0)
return true;
return false;
}
主函数
public static void main(String[] args) {
Map<Character, Character> map = new HashMap<>();
map.put('(',')'); map.put('{','}'); map.put('[',']');
String str="({})[]()}";
System.out.println(check(map, str));
}