36.有效的括號
(力扣20題)
示例 1:
**輸入:**s = “()”
**輸出:**true
示例 2:
**輸入:**s = “()[]{}”
**輸出:**true
示例 3:
**輸入:**s = “(]”
**輸出:**false
示例 4:
**輸入:**s = “([])”
**輸出:**true
提示:
-
1 <= s.length <= 104
-
s
僅由括號'()[]{}'
組成 -
括號匹配是使用棧解決的經典問題。
Linux系統,系統是如何知道進入了目錄呢 ,也是棧的應用
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判斷字符串是否有效。
- 解題思路
- 初步判斷:如果字符串長度為奇數,直接返回
false
,因為合法的括號字符串長度必須是偶數。 - 初始化棧:定義一個棧
st
,用于存儲右括號。 - 遍歷字符串:
- 遇到左括號(
(
、[
、{
),將對應的右括號()
、]
、}
)壓入棧中。 - 遇到右括號時,檢查棧是否為空或棧頂元素是否與當前右括號匹配。如果不匹配或棧為空,返回
false
;否則彈出棧頂元素。
- 遇到左括號(
- 最終判斷:遍歷結束后,檢查棧是否為空。如果棧為空,說明所有左括號都找到了對應的右括號,返回
true
;否則返回false
。
這種方法利用了棧的“后進先出”特性,確保每個左括號都能找到對應的右括號,從而高效地判斷括號字符串是否合法
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
- 每個右括號都有一個對應的相同類型的左括號。
#include <iostream>
#include <stack>
using namespace std;
class Solution
{
public:bool isValid(string s){// 如果s的長度為奇數,一定不符合要求if (s.size() % 2 != 0){return false;}// 定義棧stack<char> st;for (int i = 0; i < s.size(); i++){// 處理左括號if (s[i] == '('){st.push(')');}else if (s[i] == '['){st.push(']');}else if (s[i] == '{'){st.push('}');}// 第三種情況:遍歷字符串匹配的過程中,沒有遍歷完棧已經為空了,沒有匹配的字符了,說明右括號沒有找到對應的左括號// 第二種情況:遍歷字符串匹配的過程中,發現棧里沒有我們要匹配的字符。else if(st.empty() || st.top() != s[i] ){return false;}// 匹配到了彈出匹配的else st.pop();}// 第一種情況:此時我們已經遍歷完了字符串,但是棧不為空,說明有相應的左括號沒有右括號來匹配,所以return false,否則就return truereturn st.empty();}
};
37.刪除字符串中的所有相鄰重復項
給出由小寫字母組成的字符串 s
,重復項刪除操作會選擇兩個相鄰且相同的字母,并刪除它們。
在 s
上反復執行重復項刪除操作,直到無法繼續刪除。
在完成所有重復項刪除操作后返回最終的字符串。答案保證唯一。
示例:
輸入:"abbaca"
輸出:"ca"
解釋:
例如,在 "abbaca" 中,我們可以刪除 "bb" 由于兩字母相鄰且相同,這是此時唯一可以執行刪除操作的重復項。之后我們得到字符串 "aaca",其中又只有 "aa" 可以執行重復項刪除操作,所以最后的字符串為 "ca"。
提示:
1 <= s.length <= 105
s
僅由小寫英文字母組成。
- 解題思路
本題目標是移除字符串中連續重復的字符。我們利用棧的特性來解決這個問題。遍歷字符串的每個字符,如果棧為空或當前字符與棧頂字符不相等,則將當前字符壓入棧;如果當前字符與棧頂字符相等,則彈出棧頂字符,從而移除這對重復字符。遍歷結束后,棧中剩下的字符即為移除重復后的結果。由于棧是后進先出的,我們需要將結果字符串反轉,最終返回處理后的字符串。
代碼
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
class Solution
{
public:string removeDuplicates(string s) {stack<char> st;for(char S: s){// // 如果棧為空,或者當前字符s與棧頂字符不相等if(st.empty() || S != st.top()){st.push(S);}// 彈出棧頂字符(即移除重復的字符)else{st.pop();} }// 定義一個空字符串,用于存儲最終結果string result = "";// 將棧中元素放到result字符串匯總while(!st.empty()){result += st.top();st.pop();}// 反轉字符串reverse(result.begin(), result.end());return result;}
};