32. 最長有效括號_難度困難

題目

給定一個只包含 '(' 和 ')' 的字符串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入: "(()"
輸出: 2
解釋: 最長有效括號子串爲 "()"

示例 2:

輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串爲 "()()"

思路

    掃描一遍,借用棧,將所有匹配的括號的索引處 全部置字符'0'

    例如: "()(()"的mark爲【 0, 0, (, 0, 0 】

    再例如: ")()((())"的mark爲【 ), 0, 0, (, 0, 0, 0, 0 】

    經過這樣的處理後, 此題就變成了尋找最長的連續的0的長度


解答1:

    /*
    掃描一遍,借用棧,將所有匹配的括號的索引處 全部置字符'0'
    例如: "()(()"的mark爲【 0, 0, (, 0, 0 】
    再例如: ")()((())"的mark爲【 ), 0, 0, (, 0, 0, 0, 0 】
    經過這樣的處理後, 此題就變成了尋找最長的連續的0的長度
    */

    public int longestValidParentheses(String s) {
        char[] charArr = s.toCharArray();
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < charArr.length; i++) {
            char ch = charArr[i];
            // 如果是左括號,則把括號和索引壓棧
            if (ch == '(') {
                stack.push(ch + "_" + i);
            }
            // 如果是右括號,並且棧頂也是左括號
            if (ch == ')' && !stack.isEmpty() && stack.peek().startsWith("(")) {
                String tmpStr = stack.peek();
                stack.pop();

                // 那麼:右括號所在索引位置 元素置0
                String[] tmpArr = tmpStr.split("_");
                int tmpIndex = Integer.parseInt(tmpArr[1]);
                charArr[tmpIndex] = '0';
                // 當前的索引也置0
                charArr[i] = '0';
            }            
        }

        // 遍歷數組,統計最長連續的 ‘0’
        int result = 0;
        int k = 0;
        for (int i = 0; i < charArr.length; i++) {
            if (charArr[i] == '0') {
                k++;
                result = Math.max(result, k);
            } else {
                k = 0;
            }
        }

        return result;
    }

解答2:動態規劃

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章