题目

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

初步解法

用栈保存括号左侧,遇到括号右侧比较一下,最后再比较栈是否为空即可。

#include <string>
#include <stack>
using namespace std;
class Solution {
public:
    bool isValid(string s) {
        // 奇数长度的字符串肯定不符合要求
        if (s.size() % 2 != 0)
        {
            return false;
        }
        
        stack<char> strStack = stack<char>();
        int i = 0;
        while (s[i] != '\0')
        {
            if (s[i] == '(' || s[i] == '{' || s[i] == '[')
            {
                strStack.push(s[i]);
            }else{
                // 堆中没有左符号就出现右符号的也不对
                if (strStack.size() == 0)
                {
                    return false;
                }
                if ((s[i] == ')' && strStack.top() == '(') || (s[i] == '}' && strStack.top() == '{') || (s[i] == ']' && strStack.top() == '['))
                {
                    strStack.pop();
                }else{
                    return false;
                }
            }
            i++;
        }
        return strStack.size() == 0;
    }
};

更有效率的写法

#include <string>
#include <stack>
using namespace std;
class Solution {
public:
    bool isValid(string s) {
        stack<char> str = stack<char>();
        for(auto c : s)
        {
            if (c == '(' or c == '{' or c == '[') { str.push(c); }
            else {
                if(str.empty() or (str.top() == '(' and c != ')') or (str.top() == '{' and c != '}') or (str.top() == '[' and c != ']'))
                {
                    return false;
                }
                str.pop();
            }
        }
        return str.empty();
    }
};

这样做的效率更高,初步推测是用了迭代器,所以就不用每次都判断是不是'\0',而且整体要判断的条件也少

一个还在寻找自己的三流开发者