棧-LeetCode32-最長有效括號
阿新 • • 發佈:2018-12-04
題目
給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。
示例 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() // 檢視堆疊頂部的物件,但不從堆疊中移除