算法题 增减字符串匹配

942. 增减字符串匹配

问题描述

给定只含"I"(增加)和"D"(减少)的字符串s,令n = s.length

根据s构造一个排列perm(长度为n + 1),使得对于所有的i

  • 如果s[i] == 'I',则perm[i] < perm[i + 1]
  • 如果s[i] == 'D',则perm[i] > perm[i + 1]

返回满足条件的任意一个排列perm

示例

输入: s = "IDID" 输出: [0,4,1,3,2] 解释: - I: 0 < 4 - D: 4 > 1 - I: 1 < 3 - D: 3 > 2 输入: s = "III" 输出: [0,1,2,3] 输入: s = "DDI" 输出: [3,2,0,1] 解释: - D: 3 > 2 - D: 2 > 0 - I: 0 < 1

算法思路

贪心

核心思想

  • 使用两个指针:low = 0high = n
  • 遍历字符串s
    • 如果遇到'I',选择当前最小可用数字low,然后low++
    • 如果遇到'D',选择当前最大可用数字high,然后high--
  • 最后将剩余的数字(此时low == high)添加到结果末尾

代码实现

方法一:双指针贪心

classSolution{/** * 根据增减字符串构造排列 * * @param s 只包含 'I' 和 'D' 的字符串 * @return 满足条件的排列数组 */publicint[]diStringMatch(Strings){intn=s.length();int[]result=newint[n+1];intlow=0;// 当前最小可用数字inthigh=n;// 当前最大可用数字// 遍历字符串s,构造前n个元素for(inti=0;i<n;i++){if(s.charAt(i)=='I'){// 遇到'I',选择最小的可用数字result[i]=low++;}else{// s.charAt(i) == 'D'// 遇到'D',选择最大的可用数字result[i]=high--;}}// 最后一个位置,此时low == highresult[n]=low;// 或者 result[n] = high;returnresult;}}

算法分析

  • 时间复杂度:O(n)
    • 只需要遍历字符串一次
  • 空间复杂度:O(1)
    • 只使用了常数个额外变量

算法过程

输入:s = "IDID"

  1. 初始化:low = 0,high = 4,result = [?, ?, ?, ?, ?]
  2. i=0,s[0]='I'result[0] = 0,low = 1
  3. i=1,s[1]='D'result[1] = 4,high = 3
  4. i=2,s[2]='I'result[2] = 1,low = 2
  5. i=3,s[3]='D'result[3] = 3,high = 2
  6. 最后:result[4] = 2
  7. 结果:[0,4,1,3,2]

输入:s = "DDI"

  1. 初始化:low = 0,high = 3,result = [?, ?, ?, ?]
  2. i=0,'D'result[0] = 3,high = 2
  3. i=1,'D'result[1] = 2,high = 1
  4. i=2,'I'result[2] = 0,low = 1
  5. 最后:result[3] = 1
  6. 结果:[3,2,0,1]

输入:s = "III"

  1. result[0] = 0,low = 1
  2. result[1] = 1,low = 2
  3. result[2] = 2,low = 3
  4. result[3] = 3
  5. 结果:[0,1,2,3]

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例Strings1="IDID";int[]result1=solution.diStringMatch(s1);System.out.println("Test 1: "+Arrays.toString(result1));// [0,4,1,3,2]// 验证结果verifyResult(s1,result1);// 应该输出 Valid// 测试用例2:全增加Strings2="III";int[]result2=solution.diStringMatch(s2);System.out.println("Test 2: "+Arrays.toString(result2));// [0,1,2,3]verifyResult(s2,result2);// Valid// 测试用例3:全减少Strings3="DDD";int[]result3=solution.diStringMatch(s3);System.out.println("Test 3: "+Arrays.toString(result3));// [3,2,1,0]verifyResult(s3,result3);// Valid// 测试用例4:混合情况Strings4="DDI";int[]result4=solution.diStringMatch(s4);System.out.println("Test 4: "+Arrays.toString(result4));// [3,2,0,1]verifyResult(s4,result4);// Valid// 测试用例5:单字符Strings5="I";int[]result5=solution.diStringMatch(s5);System.out.println("Test 5: "+Arrays.toString(result5));// [0,1]verifyResult(s5,result5);// ValidStrings6="D";int[]result6=solution.diStringMatch(s6);System.out.println("Test 6: "+Arrays.toString(result6));// [1,0]verifyResult(s6,result6);// Valid// 测试用例6:长字符串Strings7="IDIDIDIDID";int[]result7=solution.diStringMatch(s7);System.out.println("Test 7: Length = "+result7.length);// 11verifyResult(s7,result7);// Valid// 测试用例7:交替模式Strings8="IDIDID";int[]result8=solution.diStringMatch(s8);verifyResult(s8,result8);// ValidSystem.out.println("Test 8: Valid = "+isValidPermutation(result8,6));}privatestaticvoidverifyResult(Strings,int[]perm){booleanvalid=true;for(inti=0;i<s.length();i++){if(s.charAt(i)=='I'&&perm[i]>=perm[i+1]){valid=false;break;}if(s.charAt(i)=='D'&&perm[i]<=perm[i+1]){valid=false;break;}}// 检查是否是0到n的排列boolean[]used=newboolean[perm.length];for(intnum:perm){if(num<0||num>=perm.length||used[num]){valid=false;break;}used[num]=true;}System.out.println("验证: "+(valid?"Valid":"Invalid"));}privatestaticbooleanisValidPermutation(int[]perm,intn){boolean[]used=newboolean[n+1];for(intnum:perm){if(num<0||num>n||used[num]){returnfalse;}used[num]=true;}returntrue;}

关键点

  1. 贪心策略

    • 选择极值(最小或最大)为后续操作保留最大灵活性
  2. 数字范围

    • 必须使用0n的所有整数恰好一次
    • 双指针保证了这一点
  3. 边界处理

    • 字符串长度为n,结果数组长度为n+1
    • 最后一个元素自动确定(low == high

常见问题

  1. 贪心策略?
    • 选择极值不会限制后续的选择空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1164538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导师推荐!8款AI论文软件测评:研究生开题报告必备工具

导师推荐&#xff01;8款AI论文软件测评&#xff1a;研究生开题报告必备工具 2026年AI论文工具测评&#xff1a;为什么需要这份榜单&#xff1f; 在当前学术研究日益数字化的背景下&#xff0c;研究生群体在撰写开题报告、文献综述及论文写作过程中面临诸多挑战。从选题构思到内…

基于Django的蔬菜批发管理系统设计与实现

基于Django的蔬菜批发管理系统设计与实现 一、系统开发背景与意义 蔬菜批发行业作为农产品流通的关键环节&#xff0c;长期面临供应链效率低、损耗率高、交易流程繁琐等问题。传统模式下&#xff0c;供应商信息分散导致采购比价困难&#xff0c;库存依赖人工盘点易造成积压或缺…

【风控】逻辑回归算法

一、逻辑回归算法原理与公式 逻辑回归是风控领域最核心的信用评分与违约预测算法之一&#xff0c;它本质上是一种广义线性模型&#xff0c;用于预测二分类问题&#xff08;如用户违约与否&#xff09;。相比普通线性回归&#xff0c;逻辑回归能够保证预测结果落在[0,1][0,1][0,…

【收藏】大模型从入门到实战:程序员必学的AI技能,抓住技术红利就现在

写代码时被IDE的AI补全功能惊艳到拍手&#xff0c;用AI生成需求文档时感叹效率翻倍&#xff0c;就连调试难缠的Bug都能靠大模型快速定位——如今&#xff0c;人工智能大模型早已不是停留在PPT里的概念&#xff0c;而是实实在在融入程序员日常工作、甚至生活的“硬核帮手”。对于…

基于Django的天虹商场管理系统设计与实现

基于Django的天虹商场管理系统设计与实现 一、系统开发背景与意义 作为连锁零售标杆企业&#xff0c;天虹商场在多门店运营中面临管理协同难、数据割裂、决策滞后等挑战。传统模式下&#xff0c;各门店商品库存、销售数据需手动汇总&#xff0c;易出现信息滞后导致的补货不及时…

基于Django的鲜花预订购买管理系统设计与实现

基于Django的鲜花预订购买管理系统设计与实现 一、系统开发背景与意义 鲜花消费市场近年来呈现线上化加速趋势&#xff0c;但现有服务模式存在明显痛点&#xff1a;线下花店覆盖范围有限&#xff0c;线上平台普遍面临鲜花新鲜度难保障、配送时效差、个性化定制流程繁琐等问题。…

收藏!程序员转型难如蜀道?4大核心症结拆解+突破方向(附大模型时代适配指南)

此前在《大龄程序员的未来在何方》一文中&#xff0c;我们曾乐观探讨过程序员维系职场竞争力的多元路径&#xff0c;但现实往往更显残酷&#xff1a;不少程序员最终不得不告别深耕多年的软件开发领域&#xff0c;转向全新的职业赛道。 只有真正踏上转型之路&#xff0c;才能深切…

收藏!六模块Prompt结构精讲:让大模型精准听话的系统化方案

本文深度拆解六模块提示词核心结构&#xff08;角色/任务、核心原则、上下文处理、CoT、输出规范、Few-Shot&#xff09;&#xff0c;为程序员与大模型初学者提供可直接复用的高效Prompt编写指南&#xff0c;助力快速掌握让大模型精准执行任务的关键技巧。文中同步分享借助大模…

基于Python的美团外卖数据分析系统设计与实现

基于Python的美团外卖数据分析系统设计与实现 一、系统总体设计 基于Python的美团外卖数据分析系统以“挖掘数据价值、辅助商业决策”为核心目标&#xff0c;针对外卖平台的海量订单、用户行为及商家运营数据&#xff0c;构建集数据采集、处理、分析与可视化于一体的分析体系&a…

PVE添加ssd硬盘默认新建pool,处理

查看当前的 OSD 分类&#xff1a;Bashceph osd tree确认哪些 OSD 现在的 CLASS 是 ssd。修改 OSD 的 Class&#xff1a; 假设 OSD ID 为 10&#xff08;请替换为实际的 ID&#xff09;&#xff0c;执行以下命令&#xff1a;Bashceph osd crush rm-device-class osd.10 ceph osd…

‌当AI能自己写测试、执行、分析、报告,人类该做什么?

一、AI已全面接管测试执行链&#xff0c;但“自动化”不等于“智能化”‌ AI在软件测试领域的渗透已从边缘工具演变为核心引擎。GitHub Copilot 可根据代码上下文自动生成单元测试用例&#xff1b;Testim 与 Apifox 利用AI智能定位器实现界面变更自愈&#xff0c;将测试维护时…

基于springboot的毕业生招聘职位推荐系统

基于springboot的毕业生招聘职位推荐系统的设计与实现 一、系统总体设计 基于SpringBoot的毕业生招聘职位推荐系统以“精准匹配岗位需求、提升求职效率、优化招聘体验”为核心目标&#xff0c;解决传统招聘中毕业生与岗位信息不对称、匹配效率低、筛选成本高的问题&#xff0c;…

【计算机毕业设计案例】基于SpringBoot的药店商品管理、库存管理、销售管理、采购管理管理系统设计与实现基于SpringBoot的药店管理系统设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

告别查重 + AIGC 双重警报!宏智树 AI 教你给论文注入人工原创灵魂

作为深耕论文写作科普的教育博主&#xff0c;后台每天都被毕业生的求助刷屏&#xff1a;“查重率降到 15%&#xff0c;却因 AIGC 检测超标被打回”“降重后语句不通顺&#xff0c;导师吐槽像机器翻译”“AI 写的初稿怎么改才能躲过双重审查”。 随着高校学术审核标准升级&…

Formizee:把表单数据牢牢握在手里的开源神器

Formizee&#xff1a;把表单数据牢牢握在手里的开源神器 哈罗大家好&#xff01;今天给大家安利一个在 GitHub 上挖到的宝藏开源项目——Formizee。是不是经常有这样的困扰&#xff1a;想在网站或应用里加个表单功能&#xff0c;自己写后端逻辑又太麻烦&#xff0c;用商业平台…

‌35岁测试人转型指南:AI时代,你的核心竞争力是什么?

‌一、时代剧变&#xff1a;AI不是替代者&#xff0c;而是质量新范式的缔造者‌2026年&#xff0c;软件测试的底层逻辑已被彻底重构。 不再是“写脚本、点按钮、报缺陷”的重复劳动&#xff0c;而是‌人机协同的质量决策系统‌。阿里巴巴通义团队验证&#xff1a;AI可基于需求文…

市场份额超三成,志凌海纳 SmartX 连续 11 个季度领跑超融合软件中国市场

2026 年 1 月 14 日——国际数据公司 IDC 发布《中国超融合市场跟踪报告&#xff0c;2025 年前三季度》&#xff0c;分别对超融合整体市场、独立销售的超融合软件市场&#xff0c;以及全栈超融合市场份额进行分析。 在 2025 年前三季度超融合软件排行中&#xff0c;SmartX 以 …

Java毕设项目推荐-基于Springboot实现药店管理系统基于SpringBoot的药店管理系统设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

‌2026年,测试工程师会消失吗?

一、不是消失&#xff0c;是重构&#xff1a;测试角色的范式转移‌2026年的软件交付节奏&#xff0c;早已不是“测试阶段”后置的瀑布模型所能承载。CI/CD流水线每小时部署数十次&#xff0c;A/B测试在生产环境实时运行&#xff0c;AI驱动的异常检测系统在代码提交后3秒内反馈风…