c/c++藍橋杯經典編程題100道(18)括號匹配

括號匹配

->返回c/c++藍橋杯經典編程題100道-目錄


目錄

括號匹配

一、題型解釋

二、例題問題描述

三、C語言實現

解法1:棧匹配法(難度★)

解法2:計數器法(僅限單一括號類型,難度★☆)

四、C++實現

解法1:使用STL棧(難度★)

解法2:哈希表優化(難度★★)

五、總結對比表

六、特殊方法與內置函數補充

1. C語言中的動態棧

2. C++的?unordered_map

3. 遞歸解法(不推薦)


一、題型解釋

括號匹配是驗證字符串中的括號是否正確閉合的問題。常見題型:

  1. 基礎匹配:驗證字符串中的?()[]{}?是否成對且順序正確。

  2. 包含其他字符:字符串中混合其他字符(如字母、數字),需跳過非括號字符。

  3. 最長有效括號子串:找到字符串中最長的有效括號子串長度。

  4. 最小添加次數:計算使括號匹配所需最少添加的括號數量。


二、例題問題描述

例題1:輸入?"()[]{}",輸出?true(所有括號正確匹配)。
例題2:輸入?"{[()]}",輸出?true(嵌套括號正確匹配)。
例題3:輸入?"(]",輸出?false(括號類型不匹配)。
例題4:輸入?"()(()",輸出最長有效子串長度?2


三、C語言實現

解法1:棧匹配法(難度★)

通俗解釋

  • 像疊盤子一樣,遇到左括號“放入盤子”,遇到右括號時檢查最上面的盤子是否匹配。

c

#include <stdio.h>
#include <stdbool.h>
#include <string.h>#define MAX_SIZE 10000bool isValid(char *s) {char stack[MAX_SIZE]; // 用數組模擬棧int top = -1;         // 棧頂指針for (int i = 0; s[i] != '\0'; i++) {char c = s[i];if (c == '(' || c == '[' || c == '{') { // 左括號入棧stack[++top] = c;} else { // 右括號檢查匹配if (top == -1) return false; // 棧為空,無法匹配char topChar = stack[top--];if ((c == ')' && topChar != '(') || (c == ']' && topChar != '[') || (c == '}' && topChar != '{')) {return false;}}}return top == -1; // 棧必須為空才完全匹配
}int main() {printf("%d\n", isValid("()[]{}")); // 輸出 1(true)printf("%d\n", isValid("([)]"));    // 輸出 0(false)return 0;
}

代碼邏輯

  1. 棧初始化:數組?stack?模擬棧,top?表示棧頂索引。

  2. 遍歷字符

    • 左括號:入棧,top?加1。

    • 右括號:若棧為空直接失敗;否則彈出棧頂元素檢查是否匹配。

  3. 最終檢查:遍歷結束后棧必須為空,否則存在未閉合的左括號。


解法2:計數器法(僅限單一括號類型,難度★☆)

通俗解釋

  • 統計左右括號數量,左括號加1,右括號減1,中途不能為負,最終必須歸零(僅適用于單一括號類型,如純?())。

c

bool isValidSingleType(char *s) {int balance = 0;for (int i = 0; s[i] != '\0'; i++) {if (s[i] == '(') balance++;else if (s[i] == ')') balance--;if (balance < 0) return false; // 中途右括號過多}return balance == 0;
}int main() {printf("%d\n", isValidSingleType("(()())")); // 輸出 1printf("%d\n", isValidSingleType("())"));    // 輸出 0return 0;
}

代碼邏輯

  1. 平衡計數器:遇到左括號加1,右括號減1。

  2. 中途檢查:計數器不能為負(右括號比左括號多)。

  3. 最終檢查:計數器歸零。

  4. 局限性:無法處理混合括號類型(如?[))。


四、C++實現

解法1:使用STL棧(難度★)

通俗解釋

  • 使用C++標準庫的?stack?容器,簡化棧操作。

cpp

#include <iostream>
#include <stack>
using namespace std;bool isValid(string s) {stack<char> st;for (char c : s) {if (c == '(' || c == '[' || c == '{') { // 左括號入棧st.push(c);} else {if (st.empty()) return false; // 棧為空,無法匹配char topChar = st.top();st.pop();if ((c == ')' && topChar != '(') || (c == ']' && topChar != '[') || (c == '}' && topChar != '{')) {return false;}}}return st.empty(); // 棧必須為空
}int main() {cout << boolalpha; // 輸出true/false而非1/0cout << isValid("{[()]}") << endl; // 輸出 truecout << isValid("([)]") << endl;   // 輸出 falsereturn 0;
}

代碼邏輯

  • 與C語言棧方法邏輯相同,但使用?stack<char>?簡化棧操作。


解法2:哈希表優化(難度★★)

通俗解釋

  • 使用哈希表存儲括號對,簡化條件判斷。

cpp

#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;bool isValidHash(string s) {stack<char> st;unordered_map<char, char> pairs = {{')', '('}, {']', '['}, {'}', '{'}};for (char c : s) {if (pairs.find(c) == pairs.end()) { // 左括號入棧st.push(c);} else { // 右括號檢查匹配if (st.empty() || st.top() != pairs[c]) return false;st.pop();}}return st.empty();
}int main() {cout << isValidHash("()[]{}") << endl; // 輸出 truereturn 0;
}

代碼邏輯

  1. 哈希表存儲映射:鍵為右括號,值為對應的左括號。

  2. 簡化條件判斷:遇到右括號時,直接從哈希表取對應的左括號進行比較。


五、總結對比表

方法時間復雜度空間復雜度優點缺點
棧匹配法O(n)O(n)支持所有括號類型需要額外空間
計數器法O(n)O(1)空間高效僅支持單一括號類型
STL棧O(n)O(n)代碼簡潔依賴STL庫
哈希表優化O(n)O(n)代碼可讀性高需理解哈希表

六、特殊方法與內置函數補充

1. C語言中的動態棧

  • 實現方式:使用動態數組 (malloc?和?realloc) 實現棧,避免固定大小限制。

2. C++的?unordered_map

  • 作用:快速查找鍵值對,用于括號映射關系。

3. 遞歸解法(不推薦)

  • 局限性:遞歸深度與括號嵌套層數相關,可能導致棧溢出。

->返回c/c++藍橋杯經典編程題100道-目錄

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

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

相關文章

day02冒泡排序

思路&#xff1a; 外層循環控制循環次數(i<len)&#xff0c;設置swapFlagfalse內層循環j1(j<len-i)&#xff0c;兩兩(j和j-1)比較&#xff0c;逆序則交換內層每次循環結束&#xff0c;沒有交換&#xff0c;則break結束 內層循環j從1開始&#xff0c;小于len&#xff0c;…

如何在華為harmonyOS上調試軟件

1、設置-》關于手機-》HarmonyOS 版本連按多下&#xff0c;輸入鎖屏密碼。顯示開發者模式已打開。 2、設置-》搜索“開發人員選項”-》開啟“開發人員選項”選項。 3、在 開發者選項 中找到 “USB 調試” 并開啟。 4、開啟 “僅充電時允許 ADB 調試”。 5、設置中開啟 &quo…

供應SW7208 NVDC升降壓電池充電控制器IC

1. 概述 SW7208 是一款支持 NVDC 充電路徑管理&#xff0c;SMBus 接口和 USB PD 標準的同步雙向 buckboost 充電控制器。 SW7208 支持寬電壓輸入為 3.5 V ~ 36V&#xff0c;可以為 1 ~ 5 節電池充電&#xff0c;并且支持電池反向放電功能&#xff0c;輸出電壓可調 3V ~ 24V。…

fpga系列 HDL:Quartus II JTAG 間接配置文件 Indirect Configuration File (.jic) AS模式燒錄

先編譯生成pof文件 File->Convert Programming Files 轉換文件 Tools->Programer 燒錄

Python:凱撒密碼

題目內容&#xff1a; 凱撒密碼是古羅馬愷撒大帝用來對軍事情報進行加密的算法&#xff0c;它采用了替換方法對信息中的每一個英文字符循環替換為字母表序列該字符后面第三個字符&#xff0c;對應關系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …

如何保證緩存和數據庫一致性

保證緩存和數據庫一致性是分布式系統中的一個常見挑戰。以下是幾種常用的策略和方法,用于解決緩存與數據庫之間的數據一致性問題: 1. 基礎同步策略 基礎同步策略包括以下幾種常見的操作順序: 先更新緩存再更新數據庫:這種方法可能導致緩存中的數據成為臟數據,因為如果數…

JavaScript系列(71)--函數式編程進階詳解

JavaScript函數式編程進階詳解 &#x1f3af; 今天&#xff0c;讓我們深入探討JavaScript函數式編程的進階內容。函數式編程是一種強大的編程范式&#xff0c;它通過使用純函數和不可變數據來構建可預測和可維護的應用程序。 函數式編程進階概念 &#x1f31f; &#x1f4a1;…

postman登錄cookie設置

1.設置環境變量&#xff0c; 定義變量存放共享的登錄信息 如Cookie 2.登錄接口編碼test腳本獲取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…

c/c++藍橋杯經典編程題100道(21)背包問題

背包問題 ->返回c/c藍橋杯經典編程題100道-目錄 目錄 背包問題 一、題型解釋 二、例題問題描述 三、C語言實現 解法1&#xff1a;0-1背包&#xff08;基礎動態規劃&#xff0c;難度★&#xff09; 解法2&#xff1a;0-1背包&#xff08;空間優化版&#xff0c;難度★…

講解下MySql的外連接查詢在SpringBoot中的使用情況

在Spring Boot中使用MySQL的外連接查詢時&#xff0c;通常通過JPA、MyBatis或JDBC等持久層框架來實現。外連接查詢主要用于從多個表中獲取數據&#xff0c;即使某些表中沒有匹配的記錄。外連接分為左外連接&#xff08;LEFT JOIN&#xff09;、右外連接&#xff08;RIGHT JOIN&…

【大模型知識點】什么是KV Cache?為什么要使用KV Cache?使用KV Cache會帶來什么問題?

1.什么是KV Cache&#xff1f;為什么要使用KV Cache&#xff1f; 理解此問題&#xff0c;首先需理解自注意機制的計算和掩碼自注意力機制&#xff0c;在Decoder架構的模型中&#xff0c;每生成一個新的token&#xff0c;便需要重新執行一次自注意力計算&#xff0c;這個過程中…

【STM32】HAL庫Host MSC讀寫外部U盤及FatFS文件系統的USB Disk模式

【STM32】HAL庫Host MSC讀寫外部U盤及FatFS文件系統的USB Disk模式 在先前 分別介紹了FatFS文件系統和USB虛擬U盤MSC配置 前者通過MCU讀寫Flash建立文件系統 后者通過MSC連接電腦使其能夠被操作 這兩者可以合起來 就能夠實現同時在MCU、USB中操作Flash的文件系統 【STM32】通過…

1.1計算機的發展

一、計算機系統的概念 1、計算機系統軟件&#xff0b;硬件 軟件&#xff1a;由具有各種特殊功能的程序組成。 硬件&#xff1a;計算機的實體。如&#xff1a;主機、外設等。 硬件決定了計算機系統的上限&#xff0c;軟件決定了硬件性能發揮了多少。 2、軟件 軟件有系統軟…

本地生活服務平臺開發進入發展熱潮

本地生活服務平臺&#xff1a;當下的發展熱潮 本地生活服務平臺開發模式 在當今數字化時代&#xff0c;本地生活服務平臺開發已成為人們日常生活中不可或缺的一部分。只需動動手指&#xff0c;打開手機上的 APP&#xff0c;就能輕松滿足各類生活需求。像某團、餓XX這樣的平臺&a…

LSTM變種模型

GRU GRU簡介 門控循環神經網絡 (Gated Recurrent Neural Network&#xff0c;GRNN) 的提出&#xff0c;旨在更好地捕捉時間序列中時間步距離較大的依賴關系。它通過可學習的門來控制信息的流動。其中&#xff0c;門控循環單元 (Gated Recurrent Unit &#xff0c; GRU) 是…

詳解tensorflow的tensor和Python list及Numpy矩陣的區別

TensorFlow中的張量&#xff08;tensor&#xff09;、Python列表和NumPy矩陣在數據結構和功能上有一些顯著的區別。以下是它們的詳細介紹及代碼示例。 1、Python List 定義&#xff1a;Python列表是一種內置的數據結構&#xff0c;可以存儲不同類型的對象&#xff0c;包括數字…

多模態模型詳解

多模態模型是什么 多模態模型是一種能夠處理和理解多種數據類型&#xff08;如文本、圖像、音頻、視頻等&#xff09;的機器學習模型&#xff0c;通過融合不同模態的信息來提升任務的性能。其核心在于利用不同模態之間的互補性&#xff0c;增強模型的魯棒性和準確性。 如何融合…

微服務與網關

什么是網關 背景 單體項目中&#xff0c;前端只用訪問指定的一個端口8080&#xff0c;就可以得到任何想要的數據 微服務項目中&#xff0c;ip是不斷變化的&#xff0c;端口是多個的 解決方案&#xff1a;網關 網關&#xff1a;就是網絡的關口&#xff0c;負責請求的路由、轉發…

二分算法篇:二分答案法的巧妙應用

二分算法篇&#xff1a;二分答案法的巧妙應用 那么看到二分這兩個字想必我們一定非常熟悉&#xff0c;那么在大學期間的c語言的教學中會專門講解二分查找&#xff0c;那么我們來簡單回顧一下二分查找算法&#xff0c;我們知道二分查找是在一個有序的序列中尋找一個數在這個序列…

XZ_Mac電腦上本地化部署DeepSeek的詳細步驟

根據您的需求&#xff0c;以下是Mac電腦上本地化部署DeepSeek的詳細步驟&#xff1a; 一、下載并安裝Ollama 訪問Ollama官網&#xff1a; 打開瀏覽器&#xff0c;訪問 Ollama官網。 下載Ollama&#xff1a; 在官網中找到并點擊“Download”按鈕&#xff0c;選擇適合Mac系統的…