题目

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

    思路

    括号匹配是使用栈解决的经典问题。本题分为如下三种情况
    leetcode20 - 图1
  1. 已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
  2. 遍历字符串匹配的过程中,发现栈里没有要匹配的字符,说明括号不成对,所以return false
  3. 遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
    1. class Solution
    2. {
    3. public:
    4. bool isValid(string s)
    5. {
    6. stack<int> st;
    7. for (int i = 0; i < s.size(); i++)
    8. {
    9. if (s[i] == '(')
    10. st.push(')');
    11. else if (s[i] == '{')
    12. st.push('}');
    13. else if (s[i] == '[')
    14. st.push(']');
    15. // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
    16. // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
    17. else if (st.empty() || st.top() != s[i])
    18. return false;
    19. else
    20. st.pop(); // st.top() 与 s[i]相等,栈弹出元素
    21. }
    22. // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
    23. return st.empty();
    24. }
    25. };