LeetCode_Stack_1249. Minimum Remove to Make Valid Parentheses 移除无效的括号(Java)【栈,字符串处理】

目录

一,题目描述

英文描述

中文描述

示例与说明

二,解题思路

三,AC代码

Java

四,解题过程

第一博


 

一,题目描述

英文描述

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.

中文描述

给你一个由 '('、')' 和小写字母组成的字符串 s。

你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。

请返回任意一个合法字符串。

有效「括号字符串」应当符合以下 任意一条 要求:

空字符串或只包含小写字母的字符串
可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」

示例与说明

示例 1:


示例 2:

 
示例 3:


示例 4:

提示:

1 <= s.length <= 10^5
s[i] 可能是 '('、')' 或英文小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

二,解题思路

自左向右、自右向左遍历扫描两次。

自左向右扫描时,删除多余右括号。cnt记录左括号数目,左括号加一、右括号减一,cnt为负时删除该字符;

自右向左扫描时,删除多余左括号。逻辑同上,反过来即可。

三,AC代码

Java

class Solution {
    public String minRemoveToMakeValid(String s) {
        int cnt = 0, index = 0;
        StringBuilder sb = new StringBuilder();
        // 删除多余的右括号
        while (index < s.length()) {
            if (s.charAt(index) == '(') cnt++;
            else if (s.charAt(index) == ')') cnt--;
            if (cnt >= 0) {
                sb.append(Character.toString(s.charAt(index)));
            } else cnt = 0;
            index++;
        }
        index = sb.length() - 1;
        cnt = 0;
        // 删除多余的左括号
        while (index >= 0) {
            if (sb.charAt(index) == ')') cnt++;
            else if (sb.charAt(index) == '(') cnt--;
            if (cnt < 0) {
                sb.deleteCharAt(index);
                cnt = 0;
            }
            index--;
        }
        return sb.toString();
    }
}

 

四,解题过程

第一博

左右各扫描一遍,分别删除多余右括号、左括号,字符串处理在调试的时候废了点时间

你可能感兴趣的:(LeetCode,leetcode,简单,字符串,栈)