力扣32:最長有效括號

力扣32:最長有效括號

  • 題目
  • 思路
  • 代碼

題目

給你一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長有效(格式正確且連續)括號 子串 的長度。

左右括號匹配,即每個左括號都有對應的右括號將其閉合的字符串是格式正確的,比如 “(()())”。

思路

方法一:棧
括號類的題目我們首先想到的是應該是用棧來做,這道題也不例外。對于這種有關最值的問題我們先不要管最值,先思考我們如何得到有效括號子串的長度。其實我們仔細想一想子串的長度不就是最后一個有效的右括號的下標減去最后一個無效的右括號下標嗎,例如這個字符串")(())()“我們來觀察一下有效子串的長度應該如何更新,不就是后面的右括號下標減去第一個右括號的下標嗎。所以我們只要保證棧底里永遠存著一個最后一個無效的右括號下標即可在我們每次匹配完成后就可以用當前下標去減去這個下標就可以得到有效括號子串的長度了。
所有我們還是正常對左右括號進行處理,遇到左括號進行push,遇到右括號進行pop同時更新最長子串的值。為了保證我們pop時棧不為空也就是如果字符串開頭不是左括號而是右括號例如”())“這樣,我們先對棧push一個-1。
方法二:動態規劃
對于這道題我們是否還有其他的思路,當我們遇到一個有效子串也就是一個左括號一個右括號,那么新的有效長度不就是在原來的基礎上進行+2嗎。所以我們是否可以設置一個數組來存儲以當前位置為結尾的有效子串長度。
那么對于左括號和右括號來說數組的值分別是多少呢,對于左括號來說如果以一個左括號為結尾那么有效子串長度毫無疑問就是0,而對于一個右括號來說子串的長度就需要進行討論了。所以我們在創建數組時可以先將其全部置為0然后只對遇到右括號時再進行剩下的處理。那么遇到右括號一共不就兩種情況嗎前一個位置是左括號和前一個位置不是左括號,如果前一個位置是左括號那么不就匹配成功了我們就可以在原本的基礎上對子串長度加2即可。關鍵是如果前一個位置不是左括號呢,這時候我們就需要再做一個判斷也就是在去除那些有效子串后的位置是不是左括號例如這種情況”()(()())",當我們遇到最后一個右括號時我們發現它也是匹配成功的只是匹配的遠了點所以我們需要判斷在去除了前面的有效子串后的前一個位置是不是左括號,如果是我們就可以在數組的再前一個位置的基礎上進行+2。
一樣的我們發現數組的每一個位置都是答案所以這也是動態規劃思想。

代碼

方法一:棧

class Solution {
public:int longestValidParentheses(string s) {stack<int> st;st.push(-1);int res = 0;for (int i = 0; i < s.size(); i++) {if (s[i] == '(') {// 如果遇到左括號就插入棧中st.push(i);} else {// 如果是右括號// 先對棧進行pop,因為我們提前插入了一個-1所以棧不可能為空st.pop();// 如果在pop后棧為空了說明從這個位置開始要重新計算長度了if (st.empty()) {st.push(i);} else {res = max(res, i - st.top());}}}return res;}
};

方法二:動態規劃

class Solution {
public:int longestValidParentheses(string s) {int res = 0;int n = s.size();// 使用數組存儲以當前位置為結尾的符合條件的最長子串的長度vector<int> dp(n, 0);for (int i = 1; i < n; i++) {// 如果為左括號則不用管因為以左括號為結尾肯定不符合條件if (s[i] == ')') {// 有兩種情況,i-1是左括號或者右括號if (s[i - 1] == '(') {// 如果是左括號則說明括號匹配上了dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;}// 如果為右括號// 還需要判斷去除前面的有效括號后的那位字符是不是左括號// 如果是就匹配上了else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') {dp[i] = dp[i - 1] +(i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;}res = max(res, dp[i]);}}return res;}
};

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

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

相關文章

機器學習實例應用

K最近鄰算法K近鄰算法(KNN,k-Nearest Neighbor),每個樣本都可以用它的最接近的K個鄰近值來代表。算法說明&#xff1a;①輸入沒有標簽的新數據&#xff0c;將新數據的每個特征與樣本集中數據對應的特征進行比較&#xff0c;然后算法提取樣本集中特征最相似數據&#xff08;最近…

力扣 hot100 Day77

連做了幾個動態規劃的中等題&#xff0c;還是比較有套路的&#xff0c;這里只簡要分析一下最長遞增子序列&#xff0c;設定dp[i]為以nums[i]結尾的最長子序列&#xff0c;遞推公式就好推了乘積最大子數組&#xff0c;和上面類似&#xff0c;但考慮到負負得正&#xff0c;所以需…

深入解析RabbitMQ與AMQP-CPP:從原理到實戰應用

一、RabbitMQ安裝 1.安裝 RabbitMQ sudo apt install rabbitmq-serverRabbitMQ 的簡單使用 # 啟動服務 sudo systemctl start rabbitmq-server.service # 查看服務狀態 sudo systemctl status rabbitmq-server.service # 安裝完成的時候默認有個用戶 guest &#xff0c;但是權限…

(論文速讀)ViDAR:視覺自動駕駛預訓練框架

論文題目&#xff1a;Visual Point Cloud Forecasting enables Scalable Autonomous Driving&#xff08;視覺點云預測實現可擴展的自動駕駛&#xff09; 會議&#xff1a;CVPR2024 摘要&#xff1a;與對通用視覺的廣泛研究相比&#xff0c;可擴展視覺自動駕駛的預訓練很少被探…

《Unity Shader入門精要》學習筆記二

1、基礎光照&#xff08;1&#xff09;看世界的光模擬真實的光照環境來生成一張圖像&#xff0c;需要考慮3種物理現象。光線從光源中被發射出來。光線和場景中的一些物體相交&#xff1a;一些光線被物體吸收了&#xff0c;而另一些光線被散射到其他方向攝像機吸收了一些光&…

Windchill 11.0使用枚舉類型自定義實用程序實現生命周期狀態管理

一、Enumerated Type Customization Utility 枚舉類型自定義實用程序,可用于添加或編輯枚舉類型的值,在Windchill 12.0+中可直接在類型和屬性管理中編輯,如下圖所示,而在Windchill 11.0中只能通過windchill shell啟動程序,下面將詳細介紹Windchill 11.0中啟動并使用枚舉類…

UGUI源碼剖析(10):總結——基于源碼分析的UGUI設計原則與性能優化策略

UGUI源碼剖析&#xff08;第十章&#xff09;&#xff1a;總結——基于源碼分析的UGUI設計原則與性能優化策略 本系列文章對UGUI的核心組件與系統進行了深入的源代碼級分析。本章旨在對前述內容進行系統性總結&#xff0c;提煉出UGUI框架最核心的設計原則&#xff0c;并基于這些…

STM32N6引入NPU,為邊緣AI插上“隱形的翅膀”

2025年的春天格外特別。伴隨著人形機器人、DeepSeek的強勢刷屏&#xff0c;AI成了最有前景的賽道。萬物皆可AI&#xff0c;萬物也在尋覓用上AI或者讓AI“轉正”的“aha moment”。 幫助機器更好地“思考”&#xff0c;讓更多的AI走向邊緣&#xff0c;是AI發展的重要趨勢之一。…

演練:使用VB開發多智能體協作的榮格八維分析器

在大語言模型高速發展的時代&#xff0c;我們面對困難的語義分析任務&#xff0c;通過構建智能體進行處理是一個流行趨勢。本文將介紹如何使用 Visual Basic .NET 開發一個多智能體協作系統&#xff0c;用于分析聊天記錄中特定人物的榮格八維人格類型。 本文使用 CC-BY-NC-SA …

llamafactory使用qlora訓練

llamafactory使用qlora訓練 1.環境搭建 conda create -n qlora python3.10 -y conda activate qlora# 克隆LLaMA-Factory倉庫 git clone https://github.com/hiyouga/LLaMA-Factory.git# 進入倉庫目錄 cd LLaMA-Factory# 切換到0.9.4版本 git checkout v0.9.4pip install -e .2…

模型微調/量化技術整理

一、模型微調技術1.模型微調簡介大模型微調(Fine-tuning)&#xff0c;是指在已經預訓練好的大語言模型基礎上&#xff08;基座模型&#xff09;&#xff0c;使用特定的數據集進行進一步訓練&#xff0c;讓模型適應特定任務或領域。通常LLM的預訓練是無監督的&#xff0c;但微調…

實踐筆記-VSCode與IDE同步問題解決指南;程序總是進入中斷服務程序。

一、VSCode 修改文件后&#xff0c;IDE 未同步如果你在 VSCode 中異步修改了項目文件內容&#xff0c;但 S32DS 或 Keil&#xff08;等集成開發環境&#xff09;中的項目沒有同步更新&#xff0c;有兩個解決方法&#xff1a;檢查文件是否已保存&#xff1a;確保 VSCode 中修改的…

C#WPF實戰出真汁04--登錄功能實現

1、登錄功能實現要點對于登錄系統&#xff0c;應該注意幾個要點&#xff1a;用戶認證流程設計&#xff0c;密碼存儲與驗證&#xff0c;會話管理&#xff0c;防暴力破解措施&#xff0c;錯誤處理與提示2、登錄功能的視圖模型首先在xaml文件中必須指定該頁面使用的視圖模型&#…

鴻蒙入門簡化版

第一步&#xff1a; 首先下載DEVStudio https://developer.huawei.com/consumer/cn/deveco-studio/ 第二步&#xff1a; 了解基本的ArkTs語言 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/introduction-to-arkts 第三步 &#xff1a; 教學視頻有兩個途徑&a…

day25|學習前端js

函數聲明&#xff0c;被提升&#xff08;hoisting&#xff09;。函數表達式必須先定義才能用。對象解構&#xff0c;按屬性名數組解構按順序點運算符. 對象.屬性名哪些可迭代&#xff08;可以被for..of循環的東西&#xff09;&#xff1a;array&#xff0c;string&#xff0c;m…

quic協議與應用開發

quic為什么出現&#xff1f;quic主要是為了解決TCP協議的局限性而提出的&#xff0c;具體來說是要解決如下問題&#xff1a;1. 加密連接建立時間長TCP協議是傳輸層協議&#xff0c;而TLS是會話層協議&#xff0c;在Linux等主流操作系統中TCP在內核實現而TLS一般在用戶態實現&am…

【淺學】tflite-micro + ESP32S3 + VScode + ESP-IDF 基于例程快速實現自己的圖像分類模型訓練部署全流程

如果你用Pytorch訓練的模型那么可以參考我的步驟&#xff0c;使用的是Tensorflow的話參考官方文檔即可&#xff0c;但流程都是一樣的&#xff0c;每一步我都會提到部分操作細節及注意事項 官方教程 要詳細學習的話tflite-micro里的微控制器章節下都詳細看&#xff08;頁面左側…

【HarmonyOS】應用設置全屏和安全區域詳解

【HarmonyOS】應用設置全屏和安全區域詳解 一、前言 IDE創建的鴻蒙應用&#xff0c;默認采取組件安全區布局方案。頂部會預留狀態欄區域&#xff0c;底部會預留導航條區域。這就是所謂的安全區域。 如果不處理&#xff0c;界面效果很割裂。所以業內UI交互設計&#xff0c;都會設…

openfeign 只有接口如何創建bean的

OpenFeign 能夠為純接口創建 Spring Bean&#xff0c;其核心機制是通過動態代理和 Spring 的 FactoryBean 機制實現的。以下是詳細的工作原理&#xff1a;1. EnableFeignClients 注解的啟動在 Spring Boot 主類上添加 EnableFeignClients 注解&#xff1a;SpringBootApplicatio…

【展廳多媒體】互動地磚屏怎么提升展廳互動感的?

在數字化展廳設計中&#xff0c;互動地磚屏 正成為提升觀眾參與度的重要工具。這種融合視覺科技與交互體驗的裝置&#xff0c;通過動態影像與即時反饋&#xff0c;讓參觀者從被動觀看轉變為主動探索&#xff0c;從而大幅增強展廳的互動感。 Led地面互動屏的優勢在于其強大的視…