给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
- * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
输入例子1: "()"
输出例子1: true
输入例子2: "(*)"
输出例子2: true
输入例子3: "(*))"
输出例子3: true
输入例子4: "(((******((("
输出例子4: false
package nowcoder;
import java.util.ArrayList;
import java.util.Scanner;
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean checkValidString (String s) {
ArrayList<Integer> brackets=new ArrayList<Integer>(); //存储左括号
ArrayList<Integer> asterisk=new ArrayList<Integer>(); //存储*号
int size1=0;//左括号列表长度
int size2=0;//*号列表长度
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='(') {
brackets.add(i);
}else if(s.charAt(i)=='*') {
asterisk.add(i);
}else {
size1=brackets.size();
size2=asterisk.size();
if(size1!=0&&brackets.get(size1-1)<i) {//左括号列表不为空且最近一个左括号索引值小于当前值
brackets.remove(size1-1);
}else if(size2!=0&&asterisk.get(size1-1)<i){//*号列表不为空且最近一个*号索引值小于当前值
asterisk.remove(size2-1);
}else {//没有左括号和*号与右括号匹配
return false;
}
}
}
size1=brackets.size();//右括号匹配完毕后的左括号*号列表长度
size2=asterisk.size();
if(size1==0) {//左括号列表为空,则匹配完成
return true;
}else if(size1<=size2) {//左括号与*号匹配
for(int k=0;k<asterisk.size();k++) {//将左括号列表值与*号比对
if(brackets.size()!=0&&brackets.get(0)<asterisk.get(k)) {
brackets.remove(0);
asterisk.remove(k);
k--;
}
}
if(brackets.size()==0) {//匹配完毕
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String str=scan.nextLine();
boolean result=new Solution().checkValidString(str);
System.out.println(result);
}
}