题目描述:
思路:我的思路就是一开始尽可能的把字符串中的左括号或者右括号去掉,放入到list中,然后我们根据list中出现的左括号或者右括号进行循环,如果出现左括号则从list的零索引开始,如果是出现右括号,那么从list.size - 1开始这点我思考了很久,因为如果是左括号你需要右边出现*,如果是只出现右括号则你需要左边出现*,因此这两点需要注意
class Solution {
public boolean checkValidString(String s) {
char tem[] = s.toCharArray();
List<Character> list = new ArrayList<>();
for (int i = 0; i < tem.length; i++) {
if(tem[i] == ')'){
if(list.size() == 0){
return false;
}else {
int j = list.size() - 1;
for ( ; j >= 0; j--) {
if(list.get(j) == '('){
list.remove(j);
break;
}
}
if(j == -1){
// 说明找到这里都没有找到左括号
int x = list.size() - 1;
for (; x >= 0; x--) {
if(list.get(x) == '*'){
list.remove(x);
break;
}
}
if(x == -1){
return false;
}
}
}
}else {
list.add(tem[i]);
}
}
// 把左括号或者右括号消掉
System.out.println(list.toString());
// s1用于计算出现过几次*
// 如果消到最后只剩下左括号
if(list.contains('(')){
System.out.println("出现的"+"(");
// s1计算左括号出现的次数
int s1 = 0;
// s2计算*出现的次数
int s2 = 0;
for (int i = list.size() - 1; i >= 0; i--) {
if(list.get(i) == '*'){
s2 ++;
}else {
if(s2 <= 0){
return false;
}else {
s2 --;
}
}
}
return true;
// 如果消到最后只剩下右括号
}else if(list.contains(')')) {
// s1计算右括号出现的次数
int s1 = 0;
// s2计算*出现的次数
int s2 = 0;
for (int i = 0; i < list.size(); i++) {
if(list.get(i) == '*'){
s2 ++;
}else {
if(s2 <= 0){
return false;
}else {
s2--;
}
}
}
return true;
}
return true;
}
}
自己的代码还是有很多冗余,看看这个代码
class Solution {
public boolean checkValidString(String s) {
int low = 0; // 表示*号都作为右括号时,左括号的数量
int hight = 0; // 表示*都作为左括号时,左括号的数量
// 如果hight < 0 说明*都作为左括号了,还是不够抵消不了右括号
// 如果low > 0 说明*号都作为右括号了,还是抵消不了括号的值
for (int i=0; i<s.length();i++){
char tmp = s.charAt(i);
if (tmp == '(') {
low++;
hight++;
} else if (tmp == ')') {
if (low > 0) {
low--;
}
hight--;
} else if (tmp == '*') {
if (low > 0) {
low--;
}
hight++;
}
if (hight < 0) {
return false;
}
}
return low == 0;
}
}