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"
相关推荐
计算机安禾17 小时前
【c++面向对象编程】第37篇:面向对象设计原则(一):单一职责与开闭原则
开发语言·c++·开闭原则
小明同学0117 小时前
C++后端项目:统一大模型接入 SDK(三)
开发语言·c++
Brilliantwxx17 小时前
【C++】 继承与多态(下)
开发语言·c++
C+++Python18 小时前
C++考试语法知识
开发语言·c++
凯瑟琳.奥古斯特18 小时前
操作系统核心结构解析
java·开发语言·c++·python·职场和发展
handler0118 小时前
【Linux 网络】一文读懂 HTTP 协议
linux·c语言·网络·c++·笔记·网络协议·http
小明同学0118 小时前
C++后端项目:统一大模型接入 SDK(二)
开发语言·c++
我不是懒洋洋18 小时前
【C++】类和对象( 类的定义、实例化、 this指针、 C++和C语言实现Stack对比)
c语言·开发语言·数据结构·c++·经验分享·算法·visual studio
故事和你9119 小时前
洛谷-【图论2-3】最小生成树1
开发语言·数据结构·c++·算法·动态规划·图论
故事和你9119 小时前
洛谷-【图论2-3】最小生成树2
开发语言·数据结构·c++·算法·动态规划·图论