Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Leetcode_1249_Minimum Remove to Make Valid Parentheses #52

Open
lihe opened this issue Dec 20, 2019 · 0 comments
Open

Leetcode_1249_Minimum Remove to Make Valid Parentheses #52

lihe opened this issue Dec 20, 2019 · 0 comments
Labels

Comments

@lihe
Copy link
Owner

lihe commented Dec 20, 2019

Minimum Remove to Make Valid Parentheses

Given a string s of '(' , ')' and lowercase English characters.

Your task is to remove the minimum number of parentheses ( '(' or ')', in any positions ) so that the resulting parentheses string is valid and return any valid string.

Formally, a parentheses string is valid if and only if:

  • It is the empty string, contains only lowercase characters, or
  • It can be written as AB (A concatenated with B), where A and B are valid strings, or
  • It can be written as (A), where A is a valid string.

Example 1:

Input: s = "lee(t(c)o)de)"
Output: "lee(t(c)o)de"
Explanation: "lee(t(co)de)" , "lee(t(c)ode)" would also be accepted.

Example 2:

Input: s = "a)b(c)d"
Output: "ab(c)d"

Example 3:

Input: s = "))(("
Output: ""
Explanation: An empty string is also valid.

Example 4:

Input: s = "(a(b(c)d)"
Output: "a(b(c)d)"

Constraints:

  • 1 <= s.length <= 10^5
  • s[i] is one of '(' , ')' and lowercase English letters.

算法思路:利用栈来解决这题,栈中存储下标。从左到有遍历字符串,如果先出现),则此位置的)直接不可用;如果出现(,则将下标压进栈中,继续遍历;再遇到),则查看栈中是否有(,如果有则将其弹出,否则,此位置的)不可用。

class Solution {
    public String minRemoveToMakeValid(String s) {
        Stack<Integer> stc = new Stack<>();
        boolean[] invalidIndex = new boolean[s.length()];

        StringBuilder result = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '('){
                stc.push(i);
                invalidIndex[i] = true;
            }

            if(s.charAt(i) == ')'){
                if(stc.empty()){
                    invalidIndex[i] = true;
                }else {
                    invalidIndex[stc.pop()] = false;
                }
            }
        }
        for(int i = 0; i < s.length(); i++){
            if(!invalidIndex[i]){
                result.append(s.charAt(i));
            }
        }
        return result.toString();
    }
}
@lihe lihe added the Leetcode label Dec 20, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant