當(dāng)前位置:
首頁 >
LeetCode 678. 有效的括号字符串(栈)
發(fā)布時(shí)間:2024/7/5
33
豆豆
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 678. 有效的括号字符串(栈)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 題目
給定一個(gè)只包含三種字符的字符串:( ,) 和 *,寫一個(gè)函數(shù)來檢驗(yàn)這個(gè)字符串是否為有效字符串。有效字符串具有如下規(guī)則:
- 任何左括號 ( 必須有相應(yīng)的右括號 )。
- 任何右括號 ) 必須有相應(yīng)的左括號 ( 。
- 左括號 ( 必須在對應(yīng)的右括號之前 )。
- * 可以被視為單個(gè)右括號 ) ,或單個(gè)左括號 ( ,或一個(gè)空字符串。
- 一個(gè)空字符串也被視為有效字符串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parenthesis-string
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
2.1 正反兩次掃描
class Solution { public:bool checkValidString(string s) {int i, star = 0, left = 0, right = 0;for(i = 0; i < s.size(); ++i){if(s[i] == '(')left++;else if(s[i] == '*')star++;else if(s[i] == ')'){if(left)left--;else if(star)star--;elsereturn false;}}left = right = star = 0;for(i = s.size()-1; i >= 0; --i){if(s[i] == ')')right++;else if(s[i] == '*')star++;else if(s[i] == '('){if(right)right--;else if(star)star--;elsereturn false;}}return true;} };2.2 棧
兩個(gè)棧,分別存儲(和*的下標(biāo)
class Solution { public:bool checkValidString(string s) {stack<int> l;stack<int> star;for(int i = 0; i < s.size(); ++i){if(s[i] == '(')l.push(i);else if(s[i] == '*')star.push(i);else{if(l.empty() && star.empty())return false;//不夠匹配if(!l.empty())l.pop();elsestar.pop();}}while(!l.empty() && !star.empty()){if(l.top() > star.top())// * ( 不能匹配return false;l.pop();star.pop();}return l.empty();} };總結(jié)
以上是生活随笔為你收集整理的LeetCode 678. 有效的括号字符串(栈)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1190. 反转每对括
- 下一篇: LeetCode 1348. 推文计数(