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

【LeetCode 每日一题】1768. 交替合并字符串

Problem: 1768. 交替合并字符串

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(M + N)
    • 空间复杂度:O(M + N)

整体思路

这段代码的目的是交替合并两个字符串 word1word2。合并规则是:从 word1 取第一个字符,然后从 word2 取第一个字符,接着从 word1 取第二个,从 word2 取第二个,以此类推。如果其中一个字符串比另一个长,那么在较短的字符串用完后,将较长字符串的剩余部分直接追加到结果的末尾。

该算法采用了一种非常直接和高效的 单次遍历 策略,并使用 StringBuilder 来高效地构建结果字符串。

  1. 数据结构选择:StringBuilder

    • 在Java中,字符串 String 对象是不可变的。如果直接使用 +concat() 来拼接字符串,每次操作都会创建一个新的 String 对象,导致性能低下(时间复杂度会是 O(N^2))。
    • StringBuilder 是一个可变的字符序列,append() 操作的均摊时间复杂度是 O(1)。因此,它是构建新字符串的最佳选择。代码通过 new StringBuilder(m + n) 初始化了足够的容量,进一步避免了在构建过程中可能发生的内部数组扩容,是一个很好的微优化。
  2. 核心遍历逻辑

    • for (int i = 0; i < n || i < m; i++): 这是算法的核心。这个循环条件确保了遍历会持续进行,直到两个字符串中较长的那个也被完全处理完。i 在这里充当了一个统一的索引。
    • 交替追加:在循环的每一次迭代中,它尝试从两个字符串中各取一个字符:
      a. if (i < m): 首先检查当前索引 i 是否在 word1 的有效范围内。如果是,就将 word1.charAt(i) 追加到 ans 中。
      b. if (i < n): 接着检查当前索引 i 是否在 word2 的有效范围内。如果是,就将 word2.charAt(i) 追加到 ans 中。
    • 处理不等长:当较短的字符串用完后(例如,i >= m),第一个 if 条件将不再满足,但第二个 if 条件(如果 word2 更长)仍然会满足。这样,循环会自然地将 word2 的剩余部分逐一追加到 ans 的末尾,完美地实现了题目要求。
  3. 返回结果

    • 当循环结束后,StringBuilder ans 中就包含了完整的合并后的字符串。
    • return ans.toString();: 调用 toString() 方法将其转换为一个不可变的 String 对象并返回。

完整代码

class Solution {/*** 交替合并两个字符串。* @param word1 第一个字符串* @param word2 第二个字符串* @return 合并后的新字符串*/public String mergeAlternately(String word1, String word2) {int m = word1.length();int n = word2.length();// 使用 StringBuilder 高效构建字符串,并预设容量以优化性能。StringBuilder ans = new StringBuilder(m + n);// 核心循环:遍历直到处理完两个字符串中最长的那个。// i 是一个统一的索引。for (int i = 0; i < n || i < m; i++) {// 如果索引 i 在 word1 的范围内,追加 word1 的第 i 个字符。if (i < m) {ans.append(word1.charAt(i));}// 如果索引 i 在 word2 的范围内,追加 word2 的第 i 个字符。if (i < n) {ans.append(word2.charAt(i));}}// 将 StringBuilder 转换为 String 并返回。return ans.toString();}
}

时空复杂度

  • Mword1 的长度。
  • Nword2 的长度。

时间复杂度:O(M + N)

  1. 循环for 循环的执行次数由较长的字符串决定,总共会执行 max(M, N) 次。
  2. 循环内部操作
    • charAt(i) 是 O(1) 操作。
    • StringBuilder.append() 的均摊时间复杂度是 O(1)。
    • 因此,每次循环的内部操作是 O(1) 的。
  3. toString():最后调用 ans.toString() 会创建一个新的 String 对象,这需要复制 StringBuilder 内部字符数组的所有内容。字符总数是 M + N,所以这个操作的时间复杂度是 O(M + N)

综合分析
总的时间复杂度是 O(max(M, N)) (循环) + O(M + N) (toString)。在 Big O 表示法中,这简化为 O(M + N)

空间复杂度:O(M + N)

  1. 主要存储开销:算法创建了一个 StringBuilder 对象 ans 来构建结果。
  2. 空间大小
    • StringBuilder 内部维护一个字符数组来存储字符序列。
    • 最终,这个字符数组将包含 M + N 个字符。
    • 因此,StringBuilder 占用的空间与两个输入字符串的总长度成正比。

综合分析
算法所需的额外空间主要由 StringBuilder 决定。因此,其空间复杂度为 O(M + N)。这还没有计算最终返回的 String 对象本身,如果计算在内,空间也是 O(M+N)。

http://www.dtcms.com/a/565094.html

相关文章:

  • 大模型长文生成中的幻觉与事实性:研究进展综述
  • 在苹果设备上安装描述文件的完整步骤指南
  • 展示形网站怎么建自己可以制作微信小程序吗
  • Qwen3-VL微调自定义OCR任务
  • 【5】理解GUID和Handle:解锁UEFI驱动和应用程序的钥匙
  • [手机AI开发sdk] docs | AidLearning平台(四合一环境)
  • CTFHub XSS通关:XSS-过滤关键词
  • Java设计模式精讲---简单工厂模式
  • Spring Boot + EasyExcel 枚举转换器:通用方案
  • Pandas-之数据合并与连接
  • 大数据毕业设计项目推荐 基于大数据的广西医疗机构数据可视化分析系统 1.85w条数据【大数据毕业设计项目选题】
  • Node.Js 实现模板生成Word、Word转Pdf文件、Excel生成、上传和下载
  • 山西省建设监理协会官方网站好书推荐ppt模板免费下载
  • 机器学习中的Hello World:线性回归(一)
  • RT-DETR解码模块(Decoder)
  • 做炫舞情侣头像动态图网站建设公司网站怎么弄
  • 诚通凯胜生态建设有限公司网站莆田企业网站建设
  • IVWorks率先将8英寸GaN纳米线片商业化
  • ip网段扫描机器shell脚本
  • 智能家居品牌出海新打法:用海外网红营销讲好“未来生活剧本”
  • 做网站有效果吗网络推广公司方案
  • 基于ROS与YOLOv3的智能采购机器人设计(智能车创意组-讯飞智慧生活组)
  • 优化Elasticsearch批量写入性能:从单分片瓶颈到多索引架构
  • 高效文献阅读与笔记整理方法:从 筛选 到 3Pass 精读
  • 一步一步教你做网站后台视频广东新闻联播主持人
  • 如何用 Simulink 驱动 UE5 的海况切换
  • 多线程——并发三特性
  • 5.25基于labview交通灯+分时段控制红绿灯时间。手动输入控制labview交通灯labview版本2018,比我高都能打开。
  • 访问网站速度很慢discuz 做家教网站
  • 【树莓派5安装实时RT内核】最新版