LeetCode Longest Valid Parentheses

原題鏈接在這里:https://leetcode.com/problems/longest-valid-parentheses/

題目:

Given a string containing just the characters?'('?and?')', find the length of the longest valid (well-formed) parentheses substring.

For?"(()", the longest valid parentheses substring is?"()", which has length = 2.

Another example is?")()())", where the longest valid parentheses substring is?"()()", which has length = 4.

題解:

Largest Rectangle in Histogram都是往棧內存index.?

這道題是求最長的括號序列,比較容易想到用棧這個數據結構。基本思路就是維護一個棧,遇到左括號就進棧,遇到右括號則出棧,并且判斷當前合法序列是否為最 長序列。不過這道題看似思路簡單,但是有許多比較刁鉆的測試集。具體來說,主要問題就是遇到右括號時如何判斷當前的合法序列的長度。比較健壯的方式如下:
(1) 如果當前棧為空,則說明加上當前右括號沒有合法序列(有也是之前判斷過的);
(2) 否則彈出棧頂元素,如果彈出后棧為空,則說明當前括號匹配,我們會維護一個合法開始的起點start, 合法序列的長度即為當前元素的位置 i-start+1;?否則如果棧內仍有元素,那肯定是"(". 合法序列就會從這個"("下一位開始. 長度為當前棧頂元素的位置的下一位到當前元素的距離. i-(stk.peek()+1)+1. 因為棧頂元素后面的括號對肯定是合法的, 而 且左括號出過棧了。

Time Complexity: O(n). Space: O(n).

AC Java:

 1 public class Solution {
 2     public int longestValidParentheses(String s) {
 3         if(s == null || s.length() == 0){
 4             return 0;
 5         }
 6         
 7         int res = 0;
 8         int start = 0;
 9         
10         Stack<Integer> stk = new Stack<Integer>();
11         for(int i = 0; i<s.length(); i++){
12             if(s.charAt(i) == '('){
13                 stk.push(i);
14             }else{
15                 //遇到')',但是stack是空的,說明不合法,更新 start 到 i+1
16                 if(stk.isEmpty()){
17                     start = i+1;
18                 }else{
19                     //否則彈出棧頂
20                     stk.pop();
21                     //剩下的stack為空,說明到start 到 i是合法括號對
22                     if(stk.isEmpty()){
23                         res = Math.max(res, i-start+1);
24                     }else{
25                     //身下的stack不為空,說明當前stack的棧頂 后面的括號對才是合法的
26                         res = Math.max(res, i-stk.peek());
27                     }
28                 }
29             }
30         }
31         return res;
32     }
33 }

可以利用DP. 求最長的valid parentheses. 需要儲存的歷史信息是到當前位最長valid parentheses 長度.

狀態轉移, 若當前是")".?看當前括號的前一個括號的匹配情況,例如在7之前以6結尾的的最佳匹配是3-6, 看3之前的括號和7是否匹配,不匹配則沒有變化; 而6之前以5結尾的最佳匹配是4-5, 此時3和6匹配, 則dp[i]+2.

此外,如果與當前括號匹配的左括號之前的括號的dp值也應該加進來,因為由于添加了當前的括號,那些括號也被連接起來了。例如3和6匹配后, 1和2也應該被加到以6結尾的最佳匹配中.

)? (? )? (? (? )? )? )

0 1 2 3 4 5 6 7

Time Complexity: O(s.length()).

Space: O(s.length()).

AC Java:

class Solution {public int longestValidParentheses(String s) {if(s == null || s.length() == 0){return 0;}int res = 0;int [] dp = new int[s.length()];for(int i = 1; i<s.length(); i++){if(s.charAt(i) == ')'){if(s.charAt(i-1) == '('){dp[i] = (i-2>=0 ? dp[i-2] : 0) + 2;}else if(i - dp[i-1] > 0 && s.charAt(i-dp[i-1]-1) == '('){dp[i] = dp[i-1] + (i-dp[i-1]-2>=0 ? dp[i-dp[i-1]-2] : 0) + 2;}}res = Math.max(res, dp[i]);}return res;}
}

?也可以節省空間.?

分別計數遇到的"(" 和")"的個數l 和 r. 先從左向右掃, l == r時跟新維護res. 當r大于l 時不合法重置為0.

在反過來從右向左掃一次.

為什么不能一次呢. e.g. ()((). 中間出現不合法, 若最后及時r比l小, 但取出r*2. 答案就是4. 正解應該是2.

Time Complexity: O(s.length()). Space: O(1).

AC Java:

 1 class Solution {
 2     public int longestValidParentheses(String s) {
 3         if(s == null || s.length() == 0){
 4             return 0;
 5         }
 6         
 7         int res = 0;
 8         int l = 0;
 9         int r = 0;
10         for(int i = 0; i<s.length(); i++){
11             if(s.charAt(i) == '('){
12                 l++;
13             }else{
14                 r++;
15             }
16             
17             if(l == r){
18                 res = Math.max(res, r*2);
19             }else if(r > l){
20                 l = 0;
21                 r = 0;
22             }
23         }
24         
25         l = 0; 
26         r = 0;
27         for(int i = s.length()-1; i>=0; i--){
28             if(s.charAt(i) == '('){
29                 l++;
30             }else{
31                 r++;
32             }
33             
34             if(l == r){
35                 res = Math.max(res, r*2);
36             }else if(l > r){
37                 l = 0;
38                 r = 0;
39             }
40         }
41         return res;
42     }
43 }

?

轉載于:https://www.cnblogs.com/Dylan-Java-NYC/p/4824941.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272936.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PC和服務器的IP地址信息DNS,PC和服務器的IP地址信息DNS

PC和服務器的IP地址信息DNS 內容精選換一換網站的訪問與云服務器的網絡配置、端口通信、防火墻配置、安全組配置等多個環節相關聯。任意一個環節出現問題&#xff0c;都會導致網站無法訪問。本節操作介紹網站無法訪問時的排查思路。網站無法訪問怎么辦&#xff1f;如果打開網站…

abaqus生成adams柔性體_專欄 | HyperMesh_To_Abaqus接口——模型導入導出問題

作者介紹TechmanLXS碩士十余年工程經驗擅長Hypermesh建模&#xff0c;Hyperworks全平臺分析軟件&#xff0c;abaqus軟件。整車級被動安全(ls-dyna、Radioss)&#xff0c;零部件級(moldflow模流分析&#xff0c;塑料件聯合仿真分析)。熟知汽車車身&#xff0c;內外飾&#xff0c…

knockoutJS學習筆記01:從拼接字符串到編寫模板引擎

開篇 關于knockout的文章&#xff0c;園里已經有很多大神寫過了&#xff0c;而且都寫得很好。其實knockout學習起來還是很容易的&#xff0c;看看官網的demo和園里的文章&#xff0c;練習練習就可以上手了&#xff08;僅限使用&#xff0c;不包含研究源碼&#xff09;。之所以想…

新鄉臺達服務器驅動器維修,臺達DELTA伺服驅動器維修

與數控裝置的接口電路無關。檢查測量系統電纜連接正確、可靠&#xff0c;排除了電纜連接的問題。利用示波器檢查位置測量系統的前置放大器EXE601/5-F的Ual和Ua*Ua1和Ua2輸出波形&#xff0c;發現Ua1相無輸出。進一步檢查光柵輸出(前置放大器EXE601/5-F的輸入)信號波形&#xff…

60度斜坡怎么計算_【測繪】南方CASS土方計算方法—方格網法

01概述在我們的日常工作中&#xff0c;遇到大量的土方修正算的相關咨詢&#xff0c;為什么CASS的方格網土方修正算&#xff0c;方格設定為10米和20米&#xff0c;修正算結果有很大差異呢&#xff1f;從軟件計算原理、數據質量等方面進行分析&#xff0c;讀了這篇文章&#xff0…

NSMutableArray 排序

NSMutableArray *array1[NSMutableArray arrayWithObjects:"1","3","2", nil];//NSLog("%",array1);/*結果:(1,3,2 )*/NSLog("%",array1);NSArray *array2 [array1 sortedArrayUsingSelector:selector(compare:)];//注意 這…

綜合時如何插入scan_三綜合環境試驗箱維修時如何做出正確判斷?

三綜合環境試驗箱維修時如何做出正確判斷?三綜合環境試驗箱在試驗的過程中&#xff0c;可以根據需要設定不同的溫度情況&#xff0c;以便于為各種測試要求提供便利的條件。在測試一些材料結構或復合材料的時候&#xff0c;主要是利用其在瞬間高溫情況或者是在極低溫的連續環境…

mysql 判斷字段為null表示 false 其它為true_日拱一卒,MySQL數據庫 常用SQL優化技巧 十一式...

本文中所提到的SQL優化技巧均是基于Mysql 索引 BTree類型 。將從以下幾個方面介紹常用的SQL優化技巧&#xff1a;避免在 WHERE 子句中使用 ! 或 <> 操作符。避免在 WHERE 子句中對索引列使用 %前綴模糊查詢。避免在 WHERE 子句中對索引列使用 OR 來連接條件。避免在 WHER…

b樣條和三次樣條_樣條曲線

最近在學習軌跡規劃中的軌跡生成&#xff0c;涉及到樣條曲線方面的知識&#xff0c;總結一下。二次樣條三次樣條曲線平滑曲線的平滑性和相應的平滑性的評判準則相關&#xff0c;在[1]中&#xff0c;作者采用曲率的平方和曲率導數的平方作為評判準則其中 是路徑點的方向角。最小…

數字圖像處理

題目&#xff1a;大規模圖像中的目標檢測與分類方法 在進行圖像目標識別與跟蹤時&#xff0c;攝像機所采集的圖像&#xff0c;在成像、數字化以及傳輸過程中&#xff0c;難免會受到各種各樣噪聲的干擾&#xff0c;圖像的質量往往會出現不盡人意的退化&#xff0c;影響了圖像的視…

2015年秋季個人閱讀計劃

10月閱讀計劃&#xff1a;《軟件需求模式》 10月12日23:59前發表第一篇讀書筆記。 10月22日23:59前發表第二篇讀書筆記。 10月31日23:59前發表第三篇讀書筆記。 11月閱讀計劃&#xff1a;需求模式——軟件建模與分析 11月12日23:59前發表第一篇讀書筆記。 11月22日23:59前發表第…

內容可編輯_讓PDF像WORD一樣自由編輯,好用的PDF編輯工具推薦

在日常工作中&#xff0c;我們經常要和PDF文件打交道。以往編輯PDF文件&#xff0c;比如修改文字等&#xff0c;需要下載專門的PDF編輯軟件&#xff0c;通常編輯器都會超過200M&#xff0c;下載安裝很麻煩&#xff0c;還會擠壓電腦的儲存空間&#xff0c;影響運行速度。當迅讀P…

DHL 快遞跟蹤查詢

思路描述&#xff1a;主要使用正則表達式解析。 返回一個跟蹤步驟列表。 public class TrackingData { public string time { get; set; } public string context { get; set; } } public class DHLExpressTrackingHelper { private static string urlFormat "http://web…

會返回兩次_嫦娥五號為何用獨特的半彈道式返回方式?原來有更深遠的考慮……...

更多戰史及裝備評說&#xff0c;請移步公眾號asiavikin&#xff08;轉載請注明出處&#xff09;24日凌晨4時30分&#xff0c;嫦娥五號在文昌航天發射場由長征五號火箭成功送入地月轉移軌道&#xff0c;22時6分完成第一次軌道修正&#xff0c;可喜可賀。這是人類44年來首度去月球…

【轉】VS2013中如何解決error C4996: 'fopen'問題

原文網址&#xff1a;http://jingyan.baidu.com/article/ce436649fd61543773afd32e.html 今天編寫控制臺應用程序時出現如下錯誤 error C4996: fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_…

中關鍵字 表示空類型_C語言數據類型

程序在運行時要做的內容就是處理數據。程序要解決復雜的問題&#xff0c;就要處理不同的數據。不同的數據都是以自己本身的一種特定形式存在的&#xff0c;不同的數據類型占用不同的存儲空間。C語言中有多種不同的數據類型&#xff0c;其中包括幾個大的方向&#xff1a;基本數據…

理解inode

。 理解inode 一、inode是什么&#xff1f; 理解inode&#xff0c;要從文件儲存說起。 文件儲存在硬盤上&#xff0c;硬盤的最小存儲單位叫做"扇區"&#xff08;Sector&#xff09;。每個扇區儲存512字節&#xff08;相當于0.5KB&#xff09;。 操作系統讀取硬盤的時…

幀同步_微信小游戲接入“熊孩子噩夢”健康系統 幀同步能力上線

3月31日&#xff0c;微信小游戲官方公眾號“做個小游戲”發文宣布全新面向未成年人保護的健康系統已經上線&#xff0c;該系統聯動“成長守護平臺”的功能&#xff0c;可以更好助力家長群體對于未成年人游戲行為的監管。另外就在昨天&#xff0c;微信小游戲也曝光了另外一項新能…

【js】獲得項目路徑

1 var curWwwPathwindow.document.location.href; 2 //獲取主機地址之后的目錄&#xff0c;如&#xff1a; uimcardprj/share/meun.jsp 3 var pathNamewindow.document.location.pathname; 4 var poscurWwwPath.indexOf(pathName); //獲取主機地址&#xff0c;如&…

寫一個python程序、求解使得npv值為零的折現率_計算題專題:凈現值NPV分析與習題...

凈現值(NPV)是反映投資方案在計算期內獲利能力的動態評價指標。投資方案的凈現值是指用一個預定的基準收益率(或設定的折現率)i&#xff0c;分別把整個計算期間內各年所發生的凈現金流量都折現到投資方案開始實施時的現值之和。今天的一分錢要比明天的一分錢值錢NPV—計算公式和…