鱼C论坛

 找回密码
 立即注册
查看: 2697|回复: 1

[技术交流] C++刷LeetCode(1111. 有效括号的嵌套深度)【贪心算法】【栈】

[复制链接]
发表于 2021-5-2 16:06:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述:
  1. 有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。

  2. 嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。

  3. 有效括号字符串类型与对应的嵌套深度计算方法如下图所示:



  4.  

  5. 给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。

  6. 不相交:每个 seq[i] 只能分给 A 和 B 二者中的一个,不能既属于 A 也属于 B 。
  7. A 或 B 中的元素在原字符串中可以不连续。
  8. A.length + B.length = seq.length
  9. 深度最小:max(depth(A), depth(B)) 的可能取值最小。 
  10. 划分方案用一个长度为 seq.length 的答案数组 answer 表示,编码规则如下:

  11. answer[i] = 0,seq[i] 分给 A 。
  12. answer[i] = 1,seq[i] 分给 B 。
  13. 如果存在多个满足要求的答案,只需返回其中任意 一个 即可。

  14.  

  15. 示例 1:

  16. 输入:seq = "(()())"
  17. 输出:[0,1,1,1,1,0]
  18. 示例 2:

  19. 输入:seq = "()(())()"
  20. 输出:[0,0,0,1,1,0,1,1]
  21. 解释:本示例答案不唯一。
  22. 按此输出 A = "()()", B = "()()", max(depth(A), depth(B)) = 1,它们的深度最小。
  23. 像 [1,1,1,0,0,1,1,1],也是正确结果,其中 A = "()()()", B = "()", max(depth(A), depth(B)) = 1 。
  24.  

  25. 提示:

  26. 1 <&#160;seq.size <= 10000
  27. &#160;

  28. 有效括号字符串:

  29. 仅由&#160;"(" 和&#160;")"&#160;构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
  30. 下述几种情况同样属于有效括号字符串:

  31.   1. 空字符串
  32.   2. 连接,可以记作&#160;AB(A 与 B 连接),其中&#160;A&#160;和&#160;B&#160;都是有效括号字符串
  33.   3. 嵌套,可以记作&#160;(A),其中&#160;A&#160;是有效括号字符串
  34. 嵌套深度:

  35. 类似地,我们可以定义任意有效括号字符串 s 的 嵌套深度&#160;depth(S):

  36.   1. s 为空时,depth("") = 0
  37.   2. s 为 A 与 B 连接时,depth(A + B) = max(depth(A), depth(B)),其中&#160;A 和&#160;B&#160;都是有效括号字符串
  38.   3. s 为嵌套情况,depth("(" + A + ")") = 1 + depth(A),其中 A 是有效括号字符串

  39. 例如:"","()()",和&#160;"()(()())"&#160;都是有效括号字符串,嵌套深度分别为 0,1,2,而&#160;")(" 和&#160;"(()"&#160;都不是有效括号字符串。

  40. 来源:力扣(LeetCode)
  41. 链接:https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings
  42. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码



  1. class Solution {
  2. public:
  3.     vector<int> maxDepthAfterSplit(string seq) {
  4.         //1.确定最大深度
  5.         int len = seq.size();
  6.         stack<char>store;
  7.         int depth = 0;
  8.         for(auto cha : seq){
  9.             if(cha == '('){
  10.                 store.push('(');
  11.             }else if(cha == ')'){
  12.                 int temp = store.size();
  13.                 depth = max(depth, temp);
  14.                 store.pop();
  15.             }
  16.         }
  17.         //2.确定A,B中的最大嵌套深度
  18.         int max_depth = (depth+1) / 2;
  19.         //3.贪心算法
  20.         vector<int>res(len, -1);
  21.         for(int i = 0; i < len; i++){
  22.             if(store.empty()){
  23.                 if(seq[i] == '('){
  24.                     store.push(seq[i]);
  25.                     res[i] = 0;
  26.                 }else if(seq[i] == ')'){
  27.                     res[i] = 1;
  28.                 }
  29.             }else if(seq[i] == '('){
  30.                 if(store.size() < max_depth){
  31.                     store.push(seq[i]);
  32.                     res[i] = 0;
  33.                 }else{
  34.                     res[i] = 1;
  35.                 }
  36.             }else if(seq[i] == ')'){
  37.                 if(!store.empty()){
  38.                     res[i] = 0;
  39.                     store.pop();
  40.                 }else{
  41.                     res[i] = 1;
  42.                 }
  43.             }
  44.         }
  45.         return res;
  46.     }
  47. };
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-2 16:06:36 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 16:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表