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"
相关推荐
张健11564096484 小时前
使用信号量限制并发数量
开发语言·c++
jc06204 小时前
6.1云原生之Docker
c++·docker·云原生
叶子野格6 小时前
《C语言学习:指针》12
c语言·开发语言·c++·学习·visual studio
Fuyo_11197 小时前
C++ 内存管理
c++·笔记
澈2078 小时前
C++面向对象:类与对象核心解析
c++·算法
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 141. 环形链表 | C++ 哈希表直觉解法
c++·leetcode·链表
handler019 小时前
Linux 进程探索:从 PCB 管理到 fork() 的写时拷贝
linux·c语言·c++·笔记·学习
众少成多积小致巨9 小时前
GNU Make 核心指南
android·c++
谭欣辰10 小时前
详细讲解 C++ 状压 DP
开发语言·c++·动态规划
William_wL_10 小时前
【C++】stack和queue的使用和实现(附加deque的简单介绍)
开发语言·c++