1. 程式人生 > >棧-LeetCode32-最長有效括號

棧-LeetCode32-最長有效括號

題目

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

示例 1:

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

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

思路

明顯地,使用棧。將成對的括號轉化為數字。遍歷輸入的字串,分為以下情況:

1. 如果是 '(' :  push入棧

2. 如果是 ')'

    2.1 如果左一(下一)為 ')' : push入棧

    2.2 如果左一超範圍(棧空): push入棧

    2.3 如果左一為 '(' : 與左一'(' 組合成 "()",替換為數字2。將數字2與左側所有數字求和並替代之。

    2.4 如果左一為數字

          2.4.1 如果左二為 ')' : push入棧

          2.4.2 如果左二超範圍 : push入棧

          2.4.3 如果左二為'(': 與左二'(' 組合成"(數字a)",替換為數字(a+2)。將數字(a+2)與左側所有數字求和並替代之。

棧中最大數字即為所求。

程式碼

class Solution {
    public int longestValidParentheses(String s) {
        int res=0;
        Stack<String> stack=new Stack<String>();
        
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='('){
                stack.push(s.charAt(i)+"");
            }else{
                if(stack.empty() || stack.peek().equals(")") ){
                    stack.push(s.charAt(i)+"");
                }else if(stack.peek().equals("(") ){
                    stack.pop();
                    stack.push("2");
                    int count=0;
                    while(true){
                        if(stack.empty() || stack.peek().equals("(") || stack.peek().equals(")") ){
                            stack.push(count+"");
                            break;
                        }else{
                            count+=Integer.parseInt(stack.pop());
                        }
                    }
                }else{
                    // 左1為數字
                    // 拿到左2
                    String zuo1=stack.pop();
                    if(stack.empty()){
                        stack.push(zuo1);
                        stack.push(s.charAt(i)+"");
                    }else{
                        String zuo2=stack.peek();
                        stack.push(zuo1);
                        if(zuo2.equals(")")){
                            stack.push(s.charAt(i)+"");
                        }else if(zuo2.equals("(")){
                            int zuo1num=Integer.parseInt(stack.pop());
                            stack.pop();
                            stack.push((zuo1num+2)+"");
                            int count=0;
                            while(true){
                                if(stack.empty() || stack.peek().equals("(") || stack.peek().equals(")") ){
                                    stack.push(count+"");
                                    break;
                                } else  {
                                    count+=Integer.parseInt(stack.pop());
                                }
                            }
                        }
                    }
                   
                }
            }
        }
        
        while(true){
            if(stack.empty()){
                break;
            }
            if(stack.peek().equals("(") || stack.peek().equals(")")){
                stack.pop();
            }else{
                if(res<Integer.parseInt(stack.peek())){
                    res=Integer.parseInt(stack.pop());
                }else{
                    stack.pop();
                }
            }
        }
        return res;
    }
}

總結

1.將成對的括號轉化為數字

2. Stack

Stack<String> stack=new Stack<String>();

if( stack.empty() ) { }

String s=stack.pop()

stack.push(s)

stack.peek()      // 檢視堆疊頂部的物件,但不從堆疊中移除