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"
相关推荐
fqbqrr7 小时前
2606C++,C++构的多态
开发语言·c++
小欣加油7 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
Yolo_TvT8 小时前
C++:析构函数
c++
Hello:CodeWorld10 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
搬砖魁首12 小时前
基础能力系列 - 多线程2 - 条件变量
c++·rust·条件变量·原子类型·线程同步互斥
chase_my_dream12 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
牛油果子哥q13 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
凡人叶枫14 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
不想写代码的星星15 小时前
std::move 根本不移动,就像老婆饼里没有老婆
c++
redaijufeng15 小时前
C++雾中风景7:闭包
c++·算法·风景