1768. 交替合并字符串 详细题解

题目名称 :1768. 交替合并字符串题目来源 :LeetCode / 力扣题目难度 :简单题目链接https://leetcode.cn/problems/merge-strings-alternately/


一、暴力解法(最容易想到的方法)

  1. 思路说明 采用单指针遍历 的直观思路:用一个索引变量从头开始遍历,先取第一个字符串的字符,再取第二个字符串的字符,交替追加到结果中;当索引超出其中一个字符串的长度后,继续把另一个字符串剩余的字符全部追加到结果末尾。

  2. 时间复杂度word1 长度为 nword2 长度为 m,需要遍历所有字符 各一次,时间复杂度为 O(n + m)

  3. 空间复杂度 需要创建一个新字符串存储最终结果,长度为 n+m,额外空间复杂度为 O(n + m)(这是存储结果的必要空间,无法省略)。

  4. 适用场景 适合所有场景,逻辑直白、代码易写,新手入门首选,本题暴力法已经足够高效

  5. C++ 代码实现

cpp

运行

复制代码
#include <string>
using namespace std;

class Solution {
public:
    string mergeAlternately(string word1, string word2) {
        string res; // 存储最终结果
        int i = 0; // 单指针
        int len1 = word1.size();
        int len2 = word2.size();
        
        // 交替取字符,直到其中一个字符串遍历完
        while (i < len1 && i < len2) {
            res += word1[i];
            res += word2[i];
            i++;
        }
        // 追加 word1 剩余字符
        while (i < len1) {
            res += word1[i];
            i++;
        }
        // 追加 word2 剩余字符
        while (i < len2) {
            res += word2[i];
            i++;
        }
        return res;
    }
};

二、优化解法(时间 / 空间复杂度最优的方法)

  1. 思路演进
  • 暴力法的冗余:用了 3 个循环,代码稍显冗余;
  • 改进方向:用双指针替代单指针,一个循环搞定所有逻辑,代码更简洁,效率完全一致;
  • 本题特性:必须遍历所有字符、必须存储结果,没有可优化的计算冗余,因此最优解法仅优化代码结构,不改变复杂度。
  1. 核心思想 双指针分别遍历两个字符串,交替追加字符,任一字符串遍历完后,直接拼接另一个字符串的剩余部分。

  2. 算法步骤 ① 定义双指针 i=0(遍历 word1)、j=0(遍历 word2),定义结果字符串;② 循环:只要 i 没遍历完 word1j 没遍历完 word2;③ 如果 i 未越界,追加 word1[i]i++;④ 如果 j 未越界,追加 word2[j]j++;④ 循环结束,返回结果。

  3. 时间复杂度 依旧是 O(n + m),和暴力法一致,是理论最优时间复杂度(必须访问所有字符)。

  4. 空间复杂度 依旧是 O(n + m) ,存储结果的必要空间,无法再优化(因为题目要求返回新字符串,必须开辟空间)。

  5. C++ 代码实现(关键注释)

cpp

运行

复制代码
#include <string>
using namespace std;

class Solution {
public:
    string mergeAlternately(string word1, string word2) {
        string res;
        int i = 0, j = 0; // 双指针:i遍历word1,j遍历word2
        int len1 = word1.size(), len2 = word2.size();

        // 一个循环完成交替拼接 + 剩余字符追加
        while (i < len1 || j < len2) {
            // 先添加word1的当前字符(如果有)
            if (i < len1) {
                res += word1[i++];
            }
            // 再添加word2的当前字符(如果有)
            if (j < len2) {
                res += word2[j++];
            }
        }
        return res;
    }
};

三、两种解法对比总结

解法 时间复杂度 空间复杂度 优点 缺点
暴力法 O(n+m) O(n+m) 思路极度直观,易理解 循环数量多,代码冗余
最优解法 O(n+m) O(n+m) 代码简洁,一个循环搞定 无明显缺点(完美)

四、进一步思考(可选)

  1. 是否存在时间 O (n) 且空间 O (1) 的解法? 不存在。
    • 时间必须遍历所有字符,复杂度为 O(n+m)
    • 题目要求返回新的合并字符串 ,必须开辟空间存储结果,空间无法做到 O (1)
  2. 如果输入数据规模扩大 10 倍,哪种解法会先失效? 两种解法复杂度完全一致,都不会失效,效率相同。
  3. 类似题目推荐
      1. 合并两个有序数组
      1. 最长公共前缀
      1. 反转字符串中的单词 III

五、调试与验证

1. 手动模拟示例(示例 1:word1="abc", word2="pqr")
  • i=0, j=0:添加 ap → res="ap"
  • i=1, j=1:添加 bq → res="apbq"
  • i=2, j=2:添加 cr → res="apbqcr"
  • 遍历完成,返回结果。
2. 边界测试用例
  • 空字符串:word1="", word2="abc"→ 输出"abc"
  • 单字符:word1="a", word2="b" → 输出 "ab"
  • 一长一短:word1="abcd", word2="pq" → 输出 "apbqcd"
相关推荐
tankeven2 小时前
HJ165 小红的优惠券
c++·算法
Jasmine_llq2 小时前
《B3840 [GESP202306 二级] 找素数》
开发语言·c++·试除法·顺序输入输出算法·素数判定算法·枚举遍历算法·布尔标记算法
低频电磁之道2 小时前
C++ 中的深浅拷贝
c++
ybzj.3 小时前
2025年第十六届蓝桥杯省赛C/C++大学B组 个人题解
c++
量子炒饭大师3 小时前
【C++ 11】Cyber骇客 最后的一片净土 ——【C++11的 简单介绍 + 发展历史】历史唯物主义者带你理顺C++发展的由来
c++·dubbo·c++11
hetao17338373 小时前
2025-03-24~04-06 hetao1733837 的刷题记录
c++·算法
原来是猿3 小时前
Linux进程信号详解(三):信号保存
开发语言·c++·算法
2401_892070984 小时前
算法与数据结构精讲:最大子段和(暴力 / 优化 / 分治)+ 线段树从入门到实战
c++·算法·线段树·最大子段和
暴力求解4 小时前
C++ ---- String类(一)
开发语言·c++