有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
-
- 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
思路+代码+注释:
public boolean checkValidString(String s) {
/*
思路:使用left栈存储(的位置,star栈存储*的位置
遍历字符串,遇到)如果left不为空弹出一个(,否则看star如果star不为弹出一个*,如果都为空那么无法抵消)返回false。
遍历完字符串后,在使用star中的*抵消left中的(,如果*的位置在(的左边那么无法抵消左括号返回false,抵消完后如果left栈没有左括号说明(抵消完毕返回true,
否则返回false
*/
Stack<Integer> left=new Stack<>();
Stack<Integer> start=new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c=s.charAt(i);
if (c=='(')
{
left.add(i);
}else if (c=='*')
{
start.add(i);
}else {
if (left.size()>0)
{
left.pop();
}else if (start.size()>0)
{
start.pop();
}else {
return false;
}
}
}
while (left.size()>0 && start.size()>0)
{
int lIndex=left.peek();
int sIndex=start.peek();
//如果*在(左边那么是无法抵消左括号的,返回false
if (sIndex<lIndex)
{
return false;
}else {
left.pop();
start.pop();
}
}
if (left.size()==0)
{
return true;
}else {
return false;
}
}