【LC75】No1768. 交替合并字符串

题目描述

给你两个字符串 word1word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串

示例

示例 1:

输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1:  a   b   c
word2:    p   q   r
合并后:  a p b q c r

示例 2:

输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1:  a   b 
word2:    p   q   r   s
合并后:  a p b q   r   s

示例 3:

输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1:  a   b   c   d
word2:    p   q 
合并后:  a p b q c   d

链接

https://leetcode.cn/problems/merge-strings-alternately/description/?envType=study-plan-v2&envId=leetcode-75

思路

两个字符串按单个字母交替合并,最后把较长的字符串剩下的部分,追加到合并之后字符串的末尾。

非常简洁明了的题目,但要注意不要陷在一定要判断出 word1 长还是 word2 长的迷雾中。

PS:字符串长度变化问题,使用 StringBuilder 更省空间。

解法一:双指针法

字符串一长一短,初思考很容易陷在单指针完成的欲望中。但其实看到两个字符串,双指针是应该想到的很简单的办法。

两个指针分别指向 word1 和 word2 ,如果不拘泥于较长的字符串一定要通过裁剪,直接将所有剩余部分一次性追加到答案末尾的话,在单次循环中,分别判断两个指针是否移动到字符串末尾即可。

代码

class Solution {
    public String mergeAlternately(String word1, String word2) {
        StringBuilder sb = new StringBuilder();
        int i = 0, j = 0;
        int len1 = word1.length(), len2 = word2.length();
        while (i < len1 || j < len2){
            if (i < len1){
                sb.append(word1.charAt(i++));
            }
            if (j < len2){
                sb.append(word2.charAt(j++));
            }
        }
        return sb.toString();
    }
}
  • 时间复杂度:O(max(len1, len2)) ,只需要遍历较长的字符串长度即可

  • 空间复杂度:O(len1 + len2)

解法二:单指针法

既然两个指针每次移动的间隔相同,那么使用单指针也可以完成。此时,需要按照较短字符串的长度进行循环。

以及,较长的字符串剩余部分没必要字符一个一个循环添加,使用 substring() 可以优化成直接追加。但 substring() 也可能会创建新的字符串,从而导致额外的内存开销。

代码

class Solution {
    public String mergeAlternately(String word1, String word2) {
        StringBuilder sb = new StringBuilder();
        int minLen = Math.min(word1.length(), word2.length());
        int i = 0;
        while (i < minLen){
            sb.append(word1.charAt(i)).append(word2.charAt(i));
            i++;
        }
        sb.append(word1.substring(minLen));
        sb.append(word2.substring(minLen));       
        return sb.toString();
    }
}
  • 时间复杂度:O(len1 + len2),O(minLen) 和 两个substring() 的 复杂度 O(len1 − minLen) + O(len2 − minLen)

  • 空间复杂度:O(len1 + len2)


【LC75】No1768. 交替合并字符串
https://tiamo495.com//archives/lc75-no1768.-jiao-ti-he-bing-zi-fu-chuan
作者
tiamo495
发布于
2025年03月13日
许可协议