• 算法竞赛入门 -- 括号画家


    目录

    150. 括号画家​​​​​​

    思路解析


    150. 括号画家​​​​​​
     

     题目描述

     输入格式: 

    输入一行字符串

     输出格式

    输出一行整数,表示完美括号的最大长度

    思路解析

     首先这是经典题目 -- “括号匹配” 的变形。所以,我们能够很快反应到需要使用 “栈” 结构来处理该问题。从更加一般的角度来说,这道题属于 “栈” 结构处理的完全匹配关系

      所以,我们可以很快设计出以下代码段:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int MAX_LEN = 1e5 + 10;
    6. char str[MAX_LEN];
    7. int main() {
    8. vector<char> stk;
    9. char ch;
    10. int res = 0;
    11. int tmp_res = 0; // 记录临时答案
    12. scanf("%s", str);
    13. int len = strlen(str);
    14. for (int i = 0; i < len; ++i) {
    15. if (str[i] == '(' || str[i] == '[' || str[i] == '{') stk.push_back(str[i]);
    16. else {
    17. if (stk.size() && (str[i] - stk.back() == 2 || str[i] - stk.back() == 1)) stk.pop_back(), tmp_res += 2;
    18. else {
    19. stk.push_back('#'); // 压入阻隔信息
    20. res = max(res, tmp_res);
    21. tmp_res = 0;
    22. }
    23. }
    24. }
    25. res = max(res, tmp_res);
    26. printf("%d", res);
    27. return 0;
    28. }

    但是,这样的代码段存在BUG。 例如,我们面对测试数据 "((([]{}((()" 时,上述代码会返回 6。而正确答案应该是 4。

    这样的BUG来自于上述代码段的“缓式评估”,注意 “栈” 在处理问题时,几乎都运用到了缓式评估的思想。此时,这种思想就成了BUG的来源,因为它会连接本该断开的括号序列。

    面对这道难题,我们应该知道当匹配发生时,如果栈不为空,我们不应该直接让 tmp_res += 2。而是单独计算此时的括号序列长度。所以我们需要知道下标信息。但是,下标信息又可以告诉我们字符信息。所以,我们空间就可以减少。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. stack<int>stk;
    6. int i,ans;
    7. char str[114514],c,cc;
    8. int main()
    9. {
    10. cin>>str;
    11. int size = strlen(str);
    12. for(i = 0;i < size; ++i)
    13. {
    14. c=str[i];
    15. if(stk.size())
    16. {
    17. cc=str[stk.top()];
    18. if((c==')'&&cc=='(')||(c==']'&&cc=='[')||(c=='}'&&cc=='{')) stk.pop();
    19. else stk.push(i); // 压入阻隔信息/压入信息
    20. } // 尝试匹配
    21. else stk.push(i); // 压入阻隔信息/压入信息
    22. if(stk.size()) ans=max(ans,i-stk.top()); // 栈有剩余,单独计算长度
    23. else ans=i+1; // 没有剩余长度就是 i - (-1) == i + 1
    24. }
    25. cout<
    26. return 0;
    27. }

  • 相关阅读:
    算法---水壶问题(DFS)
    .Net Core 实现WebSocket Server 的另外三种方式
    iceberg-flink 七:累积窗口使用。(CUMULATE)
    CentOS 8 编译安装程序包示例(httpd)学习笔记
    【C++模块实现】| 【04】配置模块
    数据结构前瞻
    苏轼在密州的四首千古名作
    组合搜索组件文档
    【英语:基础高阶_全场景覆盖表达】K6.口语主题陈述——人物类
    Netty 是如何利用EventLoop实现千万级并发的
  • 原文地址:https://blog.csdn.net/qq_73643549/article/details/132918720