【栈】LeetCode 1249. 移除无效的括号

题目链接

1249. 移除无效的括号

思路

定义数组 valid 来记录每个字符的合法性,定义栈 stack 来存储每个左括号的下标。遍历数组。

  1. 碰到字母直接 valid[i] = true
  2. 碰到左括号则将索引压栈,valid[i] = true
  3. 碰到右括号进行判断
    1. 如果栈不为空,则弹出栈顶元素,valid[i] = true
    2. 如果栈为空,则 valid[i] = false
  4. 遍历结束后,检查栈内所有元素,将其索引该为false,即 valid[i] = false

代码

class Solution{
    public String minRemoveToMakeValid(String s){

        Stack<Integer> stack = new Stack<>();
        Boolean[] valid = new Boolean[s.length() + 2];

        for(int i = 0; i < s.length(); i++){

            if(Character.isLetter(s.charAt(i))){
                valid[i] = true;
                continue;
            }

            if(s.charAt(i) == '('){
                valid[i] = true;
                stack.push(i);
            }

            if(s.charAt(i) == ')'){
                if(!stack.empty()){
                    stack.pop();
                    valid[i] = true;
                }else{
                    valid[i] = false;
                }
            }
        }

        while(!stack.empty()){
            valid[stack.pop()] = false;
        }

        StringBuilder stringBuilder = new StringBuilder();

        for(int i = 0; i < s.length(); i++){
            if(valid[i]){
                stringBuilder.append(s.charAt(i));
            }
        }

        return stringBuilder.toString();
    }
}
posted @ 2023-01-05 15:45  Frodo1124  阅读(53)  评论(1编辑  收藏  举报