• LeetCode 20. 有效的括号


    暴力思路

    对于字符串s从前向后遍历。当遍历到三种右括号时,从该字符向前查找是否有配对的左括号,如果有则改成a。
    也即:
    []->aa
    {}[]->aa[]->aaaa
    [{}()]{->[aa()]{->[aaaa]{->aaaaaa{
    最后遍历一遍,如果该字符串里面有不是a的,就return false(说明没全部配对成功)

    class Solution {
    public:
        bool isValid(string s) 
        {
            for(int i= 1;i<s.length();++i)
            {
                switch(s[i])
                {
                case ')':
                {
                    for(int j=i-1;j>=0;--j)
                    {
                        if (s[j]!='a' && s[j]!='(')
                        {
                            break;
                        }
                        else if (s[j]=='(')
                        {
                            s[j]='a';
                            s[i]='a';
                            break;
                        }
                    }
                    break;
                }
                case ']':
                {
                    for(int j=i-1;j>=0;--j)
                    {
                        if (s[j]!='a' && s[j]!='[')
                        {
                            break;
                        }
                        else if (s[j]=='[')
                        {
                            s[j]='a';
                            s[i]='a';
                            break;
                        }
                    }
                    break;
                }
                case '}':
                {
                    for(int j=i-1;j>=0;--j)
                    {
                        if (s[j]!='a' && s[j]!='{')
                        {
                            break;
                        }
                        else if (s[j]=='{')
                        {
                            s[j]='a';
                            s[i]='a';
                            break;
                        }
                    }
                    break;
                }
                default:
                    break;
                }
                
            }
            for(int i=0;i<s.length();++i)
            {
                if(s[i]!='a')
                    return 0;
            }
            return 1;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    栈的方法

    本题复盘

    标准解法是栈,当时拿到题的时候知道是用栈做,但是并不知道stack的存在。
    本题学习了C++11 新特性 for(char ch:s) 增强型for循环
    复习了LeetCode 1. 两数之和中使用到的使用迭代器iter进行find
    复习了ump的key、value的对应关系:
    可以通过ump[key]找value,key是it->first,value是it->second
    其中犯了一个未判断栈空就进行比较的错。

    思路

    奇数——>直接return 0
    初始化unordered_map,(对应),[对应],{对应}
    声明一个栈

    如果是{、[、( 也即ump中有key的,压入栈

    如果是]、}、)也即ump中有value的,
    ———如果栈顶是ump中value对应的key,消掉这个栈顶
    ———否则return 0

    代码

    class Solution {
    public:
        bool isValid(string s) 
        {
            if (s.length() % 2 ==1)
                return false;
            unordered_map<char,char>ump=
            {
                {'(',')'},{'[',']'},{'{','}'}
            };
            stack<char>stk;
            for(char ch:s)
            {
                auto iter = ump.find(ch);
                if (iter != ump.end())//如果是{、[、(
                    stk.push(ch);
                else//如果是}、]、)
                {
                    if(!stk.empty() && ch == ump[stk.top()])//栈顶是)、]、}对应的(、[、{
                        stk.pop();
                    else
                        return 0;
                }
            }
            return stk.empty();
        }    
    
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    环辛炔衍生物DBCO-NH2,amine,Acid,NHS,Maleimide无铜点击反应
    C语言实验十一 指针(一)
    若依微服务版的快速构建
    esp32 usb cdc串口读写
    迈向无限可能, ATEN宏正领跑设备切换行业革命!
    MySQL-事务隔离-2
    ArcGIS Pro SDK (三)Addin控件 2 窗格界面类
    【大二Web课程设计】基于HTML+CSS技术制作抗疫感动专题网页设计
    el-table固定指定的行
    零样本学习&Domain-aware Visual Bias Eliminating for Generalized Zero-Shot Learning
  • 原文地址:https://blog.csdn.net/weixin_43737395/article/details/126365455