leetcode:761. 特殊的二进制序列

题目来源

题目描述

在这里插入图片描述

class Solution {
public:
    string makeLargestSpecial(string s) {

    }
};

题目解析

题意

我们可以把特殊的二进制序列看作“有效的括号”,1表示左括号,0表示右括号

  • 0的数量与1的数量相等:左右括号数量相等
  • 二进制序列的每一个前缀码中1的数量要大于等于0的数量,代表有效的括号:每一个左括号都有右括号匹配,并且左括号在前

比如:“11011000"可以看作”(()(()))"。

两个连续且非空的特殊的子串,然后将它们交换,代表交换两个相邻的有效括号

递归

思路

  • 把每一个有效的括号匹配都看作一部分,然后进行排序,内部也进行排序处理,例如

在这里插入图片描述

  • 这种特点天然适合递归的思路,先递归到最里层,然后一层一层向外扩展,直至完成所有的排序。
class Solution {
public:
    string makeLargestSpecial(string str) {
        int cnt = 0, i = 0;
        vector<string> v;
        string res = "";
        for (int j = 0; j < str.size(); ++j) {
            cnt += (str[j] == '1') ? 1 : -1;
            if (cnt == 0) {
                v.push_back('1' + makeLargestSpecial(str.substr(i + 1, j - i - 1)) + '0');
                i = j + 1;
            }
        }
        sort(v.begin(), v.end(), greater<string>());
        for (i = 0; i < v.size(); ++i) res += v[i];
        return res;
    }
};

类似题目

题目核心思路
leetcode:20. 有效的括号 Valid Parentheses
leetcode:1003. 检查替换后的词是否有效 Check If Word Is Valid After Substitutions
leetcode:678. 有效的括号字符串(包含(或者)和*三种字符)Valid Parenthesis String
leetcode:761. 特殊的二进制序列 Special Binary String
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值