LeetCode 678. 有效的括号字符串(栈)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 678. 有效的括号字符串(栈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給定一個只包含三種字符的字符串:( ,) 和 *,寫一個函數來檢驗這個字符串是否為有效字符串。有效字符串具有如下規則:
- 任何左括號 ( 必須有相應的右括號 )。
- 任何右括號 ) 必須有相應的左括號 ( 。
- 左括號 ( 必須在對應的右括號之前 )。
- * 可以被視為單個右括號 ) ,或單個左括號 ( ,或一個空字符串。
- 一個空字符串也被視為有效字符串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parenthesis-string
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
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 棧
兩個棧,分別存儲(和*的下標
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();} };總結
以上是生活随笔為你收集整理的LeetCode 678. 有效的括号字符串(栈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1190. 反转每对括
- 下一篇: LeetCode 1348. 推文计数(