有“( ”,“ )”,“ * ”,其中“( ”和“)”匹配,“ * ”匹配“( ”,“ )”中的一个或者0个。
思路
1、建立一个栈和一个int型数组ch;
2、遍历字符串中的每一个字符,如果是“( ”,则直接入栈;
3、如果是“ * ”,则ch[stack.size()]++,记录“ * ”在栈中的位置与个数;
4、如果是“ )”,则判断栈首元素是什么,如果栈首元素为“( ”,则ch[stack.size() - 1] += ch[stack.size()]; ch[stack.size()] = 0,并弹出“( ”元素;如果栈首元素为“ ) ”,则匹配失败;如果栈空,判断ch[stack.size() ]是否大于零,是则将ch[stack.size() ]–,不是则匹配失败。
public class Solution {
public static void main(String[] args) {
String s = "*(*)))";
int[] ch = new int[s.length()+1];
Stack<Character> stack = new Stack<Character>();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '('){
stack.push('(');
}else if(s.charAt(i) == '*'){
ch[stack.size()]++;
}else if(!stack.isEmpty() && stack.peek() == '('){
if(ch[stack.size()]>0){
ch[stack.size() - 1] += ch[stack.size()];
ch[stack.size()] = 0;
stack.pop();
}else{
stack.pop();
}
}else{
if(ch[stack.size()] > 0){
ch[stack.size()]--;
}else {
System.out.println("False");
return;
}
}
}
if(stack.isEmpty()){
System.out.println("True");
}else {
System.out.println("False");
}
}
}