当前位置: 首页 > news >正文

LeetCode 761.特殊的二进制字符串:分治(左右括号对移动)

【LetMeFly】761.特殊的二进制字符串:分治(左右括号对移动)

力扣题目链接:https://leetcode.cn/problems/special-binary-string/

特殊的二进制字符串是具有以下两个性质的二进制序列:

  • 0的数量与1的数量相等。
  • 二进制序列的每一个前缀码中1的数量要大于等于0的数量。

给定一个特殊的二进制字符串s

一次移动操作包括选择字符串s中的两个连续的、非空的、特殊子串,并交换它们。两个字符串是连续的,如果第一个字符串的最后一个字符与第二个字符串的第一个字符的索引相差正好为 1。

返回在字符串上应用任意次操作后可能得到的字典序最大的字符串。

示例 1:

输入:S = "11011000"输出:"11100100"解释:将子串 "10" (在 s[1] 出现) 和 "1100" (在 s[3] 出现)进行交换。 这是在进行若干次操作后按字典序排列最大的结果。

示例 2:

输入:s = "10"输出:"10"

提示:

  • 1 <= s.length <= 50
  • s[i]'0''1'
  • s是一个特殊的二进制字符串。

解题方法:分治

例如示例一:11011000,可以看成(()(()))

我们要做的就是保持括号处于匹配状态下,让对应的01字符串字典序尽可能大。

匹配字符串有两种组合方式:

  1. 拼接,如() + (()) = ()(())
  2. 嵌套,在()(())外面套一个括号变成(()(()))

这解法不就来了,我们可以反其道而行之,把``(()(()))拆成( () (()) )`:

对于最外层括号里的()(()),当然是(())放到()前面比较好(1100放到10前面字典序更大)

这不就是天然的递归么,(()(()))只有一个“拼接的括号”,外层总体顺序不变,内层()(())递归:

内层()(())有两个“拼接的括号”,两个拼接的括号分别递归,直到递归字符串为空递归停止,并将两个递归完成的“拼接括号”排序重新拼接到一起,变成(())()

  • 时间复杂度O ( n 2 log ⁡ n ) O(n^2\log n)O(n2logn),递归像树一样,每次执行有一个排序和字符串拼接

    (()(())) | ()(()) / \ '' ()
  • 空间复杂度O ( n ) O(n)O(n)

AC代码

C++
/* * @LastEditTime: 2026-02-20 11:21:04 *//* 11011000 (()(())) ( () (()) ) */classSolution{private:vector<pair<int,int>>split(string&s){vector<pair<int,int>>ans;intdiff=0,from=0;for(inti=0;i<s.size();i++){if(s[i]=='1'){diff++;}else{diff--;}if(!diff){ans.push_back({from,i});from=i+1;}}returnans;}public:stringmakeLargestSpecial(string s){if(s.empty()){returns;}vector<pair<int,int>>pairs=split(s);vector<string>parts;parts.reserve(pairs.size());for(auto[l,r]:pairs){parts.push_back('1'+makeLargestSpecial(s.substr(l+1,r-l-1))+'0');}sort(parts.begin(),parts.end(),greater<>());string ans;for(string&part:parts){ans+=part;}returnans;}};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.jsqmd.com/news/396536/

相关文章:

  • Qwen3-4B-Instruct-2507与Ollama集成:本地化部署快速入门教程
  • 基于Thinkphp和Laravel框架的旅游景区(门票,酒店,美食,论坛)管理系统的设计与实现
  • cv_unet_image-colorization效果实测:消费级显卡跑出高清上色,对比DeOldify差异详解
  • 国内零门槛首个免费 开源 724小时帮你干活的全场景个人助理 Agent 手把手教程
  • Face3D.ai Pro与Python结合:3D人脸建模自动化处理实战
  • 速看!2026 评价不错的移动房屋民宿品牌排行,成品移动岗亭/移动房屋/岗亭移动厕所/岗亭售货亭,移动房屋定制推荐 - 品牌推荐师
  • DCT-Net模型在嵌入式设备上的轻量化部署
  • 基于Thinkphp和Laravel框架的企业员工出勤打卡签到系统管理设计与实现
  • 基于Thinkphp和Laravel框架的口腔诊所门诊管理系统的设计与实现
  • 探索VCU控制量产模型:开启控制策略学习之旅
  • Pi0机器人控制中心:6-DOF动作预测实战演示
  • 2026年北京柏莱士手表维修推荐:多场景服务评价,针对售后时效与网点覆盖痛点 - 十大品牌推荐
  • 基于Thinkphp和Laravel框架的书影音互动科普网站
  • 如何选择可靠维修点?2026年北京百年灵手表维修推荐与评价,解决服务与安全核心痛点 - 十大品牌推荐
  • 基于Thinkphp和Laravel框架的交通旅游计划飞机订票系统
  • 腕表维修如何避坑?2026年北京爱彼手表维修推荐与评测,剖析售后与质保痛点 - 十大品牌推荐
  • 手表维修中心哪家靠谱?2026年北京宝格丽手表维修推荐与排名,解决技术标准与质保时长痛点 - 十大品牌推荐
  • 2026年北京爱马仕手表维修推荐:多场景服务评价,针对网点覆盖与响应效率痛点 - 十大品牌推荐
  • 黄仁勋:将在3月发布“世界前所未见”的全新芯片
  • 如何选择手表维修点?2026年北京爱勒手表维修推荐与排名,直击非官方服务核心痛点 - 十大品牌推荐
  • 2026年北京百达翡丽手表维修推荐:多场景服务评价与排名,直击非官方维修站信任痛点 - 十大品牌推荐
  • 2026年北京宝格丽手表维修推荐:基于多网点服务评价,针对时效与工艺痛点深度解析 - 十大品牌推荐
  • 如何选择可靠维修点?2026年北京百年灵手表维修推荐与排名,直击服务与售后痛点 - 十大品牌推荐
  • 如何选择可靠维修点?2026年北京艾米龙手表维修推荐与评测,解决服务与网点痛点 - 十大品牌推荐
  • 2026年北京爱勒手表维修推荐:多场景服务评价,针对网点覆盖与响应效率痛点 - 十大品牌推荐
  • 2026古筝选购攻略:入门级品牌哪些值得买?瑶鸾古筝Y106系列/瑶鸾古筝Y103系列(星辰),古筝实力厂家排行 - 品牌推荐师
  • 腕表维修服务哪家强?2026年北京艾米龙手表维修推荐与排名,解决网点覆盖与质保痛点 - 十大品牌推荐
  • 做程序根据你的作息自动推荐最佳入睡时间,颠覆熬夜靠硬扛。
  • 如何选择可靠维修点?2026年北京柏莱士手表维修推荐与评测,直击非官方服务痛点 - 十大品牌推荐
  • 北京爱彼维修哪个网点好?2026年北京爱彼手表维修中心推荐与排名,解决服务透明度痛点 - 十大品牌推荐