• leetcode20. 有效的括号 [简单题]


    题目

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

    有效字符串需满足:

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    思路

    典型的栈问题,数据结构书中都有用栈来作括号匹配的问题。

    字符串长度为奇数,直接返回false

    ②“( ] )”,当有这样的右括号时,也让他入栈,最后判断栈非空,则返回 false;

    ③“( ) { } } {”,

    ④“{ [ ] }”,

    代码

    1. class Solution {
    2. public:
    3. bool isValid(string s) {
    4. int len = s.length();
    5. bool flag;
    6. if (len % 2 != 0)
    7. flag = false;
    8. stack<char> st;
    9. int i;
    10. for (i = 0; i < len; i++) {
    11. // 遇到左括号,入栈
    12. if (s[i] == 40 || s[i] == 91 || s[i] == 123) {
    13. st.push(s[i]);
    14. }
    15. // 遇到右括号,取栈顶元素,看是否匹配。匹配则出栈,不匹配则入栈
    16. char a;
    17. if (s[i] == 41 || s[i] == 93 || s[i] == 125) {
    18. // 遇到右括号时,栈中无元素,则直接返回false
    19. if (st.empty()) {
    20. flag = false;
    21. break;
    22. }
    23. if (!st.empty()) {
    24. a = st.top();
    25. }
    26. if ((a == 40 && s[i] == 41) || (a == 91 && s[i] == 93) || (a == 123 && s[i] == 125)) {
    27. st.pop(); // 匹配则出栈
    28. }else{
    29. st.push(s[i]); // 不匹配则入栈
    30. }
    31. }
    32. }
    33. if (i != len) {
    34. return flag;
    35. }
    36. if (i == len && st.empty())
    37. flag = true;
    38. return flag;
    39. }
    40. };

    答案思路:

    建立map,键为右括号,值为左括号。

    1. unordered_map<char, char> pairs = {
    2. {')', '('},
    3. {']', '['},
    4. {'}', '{'}
    5. };

  • 相关阅读:
    linux篇【3】:Linux 环境基础开发工具
    SQL Server 事务
    Recorder 实现语音录制并上传到后端(兼容PC和移动端)
    OdeInt与GPU
    基础练习 查找整数
    今年的秋招面试,确实有点难。
    [Android]Jetpack Compose设置颜色
    Linux--线程的互斥
    java集合ArrayList如何赋值?
    关于MySQL主从复制的数据同步延迟问题
  • 原文地址:https://blog.csdn.net/gsj9086/article/details/133046416