【LeetCode 每日一题】1768. 交替合并字符串
Problem: 1768. 交替合并字符串
文章目录
- 整体思路
 - 完整代码
 - 时空复杂度
 - 时间复杂度:O(M + N)
 - 空间复杂度:O(M + N)
 
整体思路
这段代码的目的是交替合并两个字符串 word1 和 word2。合并规则是:从 word1 取第一个字符,然后从 word2 取第一个字符,接着从 word1 取第二个,从 word2 取第二个,以此类推。如果其中一个字符串比另一个长,那么在较短的字符串用完后,将较长字符串的剩余部分直接追加到结果的末尾。
该算法采用了一种非常直接和高效的 单次遍历 策略,并使用 StringBuilder 来高效地构建结果字符串。
-  
数据结构选择:
StringBuilder- 在Java中,字符串 
String对象是不可变的。如果直接使用+或concat()来拼接字符串,每次操作都会创建一个新的String对象,导致性能低下(时间复杂度会是 O(N^2))。 StringBuilder是一个可变的字符序列,append()操作的均摊时间复杂度是 O(1)。因此,它是构建新字符串的最佳选择。代码通过new StringBuilder(m + n)初始化了足够的容量,进一步避免了在构建过程中可能发生的内部数组扩容,是一个很好的微优化。
 - 在Java中,字符串 
 -  
核心遍历逻辑
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的末尾,完美地实现了题目要求。 
 -  
返回结果
- 当循环结束后,
StringBuilderans中就包含了完整的合并后的字符串。 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();}
}
 
时空复杂度
- 设 
M是word1的长度。 - 设 
N是word2的长度。 
时间复杂度:O(M + N)
- 循环:
for循环的执行次数由较长的字符串决定,总共会执行max(M, N)次。 - 循环内部操作: 
charAt(i)是 O(1) 操作。StringBuilder.append()的均摊时间复杂度是 O(1)。- 因此,每次循环的内部操作是 O(1) 的。
 
 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)
- 主要存储开销:算法创建了一个 
StringBuilder对象ans来构建结果。 - 空间大小: 
StringBuilder内部维护一个字符数组来存储字符序列。- 最终,这个字符数组将包含 
M + N个字符。 - 因此,
StringBuilder占用的空间与两个输入字符串的总长度成正比。 
 
综合分析:
 算法所需的额外空间主要由 StringBuilder 决定。因此,其空间复杂度为 O(M + N)。这还没有计算最终返回的 String 对象本身,如果计算在内,空间也是 O(M+N)。
