题目描述
给定一个字符串str,判断是不是整体有效的括号字符串(整体有效:即存在一种括号匹配方案,使每个括号字符均能找到对应的反向括号,且字符串中不包含非括号字符)。
输入描述:
输入包含一行,代表str(1≤lengthstr≤105)。
输出描述:
输出一行,如果str是整体有效的括号字符串,请输出“YES”,否则输出“NO”。
示例1
输入
(())
输出
YES
示例2
输入
()a()
输出
NO
说明
()a()中包含了 ‘a’,a不是括号字符
解法一:利用栈
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
boolean res = getRes(s);
System.out.println(res?"YES":"NO");
}
public static boolean getRes(String s){
if(s==null||s.length()==0) return true;
if((s.length()&1)==1) return false;
char[] arr = s.toCharArray();
Stack<Character> stack = new Stack<>();
for(int i=0;i<arr.length;i++){
if(arr[i]=='('){
stack.push(arr[i]);
}else if(arr[i]==')'){
if(stack.size()==0) return false;
stack.pop();
}else{
return false;
}
}
return stack.size()==0?true:false;
}
}
解法二:利用一个变量统计
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
boolean res = getRes(s);
System.out.println(res?"YES":"NO");
}
public static boolean getRes(String s){
if(s==null||s.length()==0) return true;
if((s.length()&1)==1) return false;
char[] arr = s.toCharArray();
int count = 0;
for(int i=0;i<arr.length;i++){
if(arr[i]=='('){
count++;
}else if(arr[i]==')'){
if(count--==0) return false;
}else{
return false;
}
}
return count==0;
}
}