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

豆包 力扣 761. 特殊的二进制字符串 public String makeLargestSpecial(String s)

你想要解决力扣 761 题「特殊的二进制字符串」,核心需求是找到给定特殊二进制字符串能重排得到的最大字典序字符串。

问题背景与解题思路

首先明确特殊的二进制字符串定义:

  1. 前缀中 ‘1’ 的数量始终不少于 ‘0’ 的数量;
  2. 整个字符串中 ‘1’ 和 ‘0’ 的数量相等。

解题核心思路(分治 + 贪心):

  1. 拆分:将原字符串拆分为若干个不可再分的「最小特殊二进制子串」(形如1...0,且内部无法再拆分为更小的特殊子串);
  2. 递归处理:对每个最小特殊子串的内部(去掉首尾的 1 和 0 后)递归处理,保证内部也是最大字典序;
  3. 排序拼接:将所有处理后的最小特殊子串按字典序降序排列,拼接后即为结果。

完整可运行代码

classSolution{publicStringmakeLargestSpecial(Strings){// 递归终止条件:空字符串或长度为0,直接返回if(s==null||s.length()==0){return"";}// 存储拆分后的最小特殊二进制子串List<String>parts=newArrayList<>();// 记录当前前缀中1的数量 - 0的数量(平衡值)intbalance=0;// 记录每个最小特殊子串的起始位置intstart=0;for(inti=0;i<s.length();i++){// 遇到1,平衡值+1;遇到0,平衡值-1balance+=s.charAt(i)=='1'?1:-1;// 当平衡值回到0时,说明找到了一个最小特殊子串 [start, i]if(balance==0){// 对该子串的内部(去掉首尾的1和0)递归处理,再拼接首尾Stringsub="1"+makeLargestSpecial(s.substring(start+1,i))+"0";parts.add(sub);// 更新下一个子串的起始位置start=i+1;}}// 将拆分后的子串按字典序降序排列(贪心:大的子串放前面,整体字典序最大)Collections.sort(parts,Collections.reverseOrder());// 拼接所有排序后的子串,得到最终结果StringBuildersb=newStringBuilder();for(Stringpart:parts){sb.append(part);}returnsb.toString();}}

代码关键部分解释

  1. 平衡值(balance)

    • 遍历字符串时,遇到 ‘1’ 加 1,遇到 ‘0’ 减 1;
    • balance == 0时,说明从start到当前位置是一个最小特殊二进制子串(无法再拆分为更小的特殊子串)。
  2. 递归处理子串内部

    • 对于找到的最小子串s[start..i],去掉首尾的 ‘1’ 和 ‘0’(即s[start+1..i-1]),递归调用函数处理内部,保证内部也是最大字典序;
    • 处理后再拼接回首尾的 ‘1’ 和 ‘0’,得到该子串的最大形式。
  3. 贪心排序

    • 将所有处理后的最小子串按字典序降序排列,拼接后整体字典序最大(例如11001010字典序大,应放在前面)。

示例验证

输入:s = "11011000"
执行过程:

  1. 拆分得到最小子串:"1100""10"
  2. 递归处理内部(无需要处理),得到["1100", "10"]
  3. 降序排序后为["1100", "10"],拼接结果为"110010"(正确答案)。

总结

  1. 核心逻辑是分治 + 贪心:将字符串拆分为最小特殊子串,递归优化内部,再按字典序降序拼接;
  2. 平衡值是拆分最小特殊子串的关键,balance == 0是拆分节点;
  3. 贪心排序保证了整体字典序最大,符合题目要求。

该解法时间复杂度主要由排序决定(假设拆分出 k 个子串,排序复杂度为 O(k log k)),空间复杂度为递归栈和存储子串的空间,是力扣该题的最优解法之一。

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

相关文章:

  • 人工智能|大模型—— 开发 ——Agent Skills设计详解
  • 从 0 到 1 安装 TRAE:国内 / 国际版双流程指南
  • webpack 学习
  • 文本处理的 CI/CD:用 NLP 静态分析解决查重飘红与 Format Error
  • 弦音墨影效果实测:Qwen2.5-VL在弱光、逆光、雾天监控视频中的鲁棒性
  • OFA视觉问答模型镜像优势:永久禁用MODELSCOPE_AUTO_INSTALL_DEPENDENCY机制解析
  • FreeRtos学习中疑惑
  • 电子游戏与人类“存续与复制”的近端机制
  • Makefile相关
  • 为什么选择科哥构建版?IndexTTS2定制镜像优势全面解析
  • C语言数据结构系列:链表详解与代码示例
  • 【2026 最新 !】分享一套优质的 SpringBoot+Vue 高校就业招聘系统的设计与实现(万字文档+源码+视频文档讲解)
  • 线程同步与互斥
  • webase部署智能合约失败报错:合约部署错误,请检查合约的构造函数入参或检查链状态...如何解决?
  • YOLO目标检测数据集大全【数据集+训练好的模型+训练检测教程】(持续更新)
  • 订单提现管理系统
  • 代码都没啥问题,Xuper超级链上创建合约时为什么solidity合约还是编译失败?
  • 对抗知网的 N-Gram 算法:基于语义解耦的【文本重构】与【事实性核验】架构设计
  • 纯VB6代码实现稳定多线程(源码下载,非ActiveX EXE)
  • 商城项目中用到的一些ubuntu系统指令
  • Ren‘Py给不同的角色安排不同的对话框
  • Agent开发学习
  • Crmeb.java项目理解(一)
  • HTB Tracks - REVERSE - SimpleEncryptor
  • Python中继承带来的问题
  • NFTMarket 1 | NFT 简介、业务、技术方案
  • 四字节十六进制转化为单精度IEEE 754 浮点数
  • 打开软件就弹出vccorlib120.dll如何修复? 附免费下载方法分享
  • Ray + LanceDB + Daft 构建大规模向量数据分析管道
  • 计算机软件资格考试——专业英语