题目名称 :1768. 交替合并字符串题目来源 :LeetCode / 力扣题目难度 :简单题目链接 :https://leetcode.cn/problems/merge-strings-alternately/
一、暴力解法(最容易想到的方法)
-
思路说明 采用单指针遍历 的直观思路:用一个索引变量从头开始遍历,先取第一个字符串的字符,再取第二个字符串的字符,交替追加到结果中;当索引超出其中一个字符串的长度后,继续把另一个字符串剩余的字符全部追加到结果末尾。
-
时间复杂度 设
word1长度为n,word2长度为m,需要遍历所有字符 各一次,时间复杂度为 O(n + m)。 -
空间复杂度 需要创建一个新字符串存储最终结果,长度为
n+m,额外空间复杂度为 O(n + m)(这是存储结果的必要空间,无法省略)。 -
适用场景 适合所有场景,逻辑直白、代码易写,新手入门首选,本题暴力法已经足够高效。
-
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;
}
};
二、优化解法(时间 / 空间复杂度最优的方法)
- 思路演进
- 暴力法的冗余:用了 3 个循环,代码稍显冗余;
- 改进方向:用双指针替代单指针,一个循环搞定所有逻辑,代码更简洁,效率完全一致;
- 本题特性:必须遍历所有字符、必须存储结果,没有可优化的计算冗余,因此最优解法仅优化代码结构,不改变复杂度。
-
核心思想 双指针分别遍历两个字符串,交替追加字符,任一字符串遍历完后,直接拼接另一个字符串的剩余部分。
-
算法步骤 ① 定义双指针
i=0(遍历 word1)、j=0(遍历 word2),定义结果字符串;② 循环:只要i没遍历完word1或j没遍历完word2;③ 如果i未越界,追加word1[i]并i++;④ 如果j未越界,追加word2[j]并j++;④ 循环结束,返回结果。 -
时间复杂度 依旧是 O(n + m),和暴力法一致,是理论最优时间复杂度(必须访问所有字符)。
-
空间复杂度 依旧是 O(n + m) ,存储结果的必要空间,无法再优化(因为题目要求返回新字符串,必须开辟空间)。
-
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) | 代码简洁,一个循环搞定 | 无明显缺点(完美) |
四、进一步思考(可选)
- 是否存在时间 O (n) 且空间 O (1) 的解法? 不存在。
- 时间必须遍历所有字符,复杂度为 O(n+m);
- 题目要求返回新的合并字符串 ,必须开辟空间存储结果,空间无法做到 O (1)。
- 如果输入数据规模扩大 10 倍,哪种解法会先失效? 两种解法复杂度完全一致,都不会失效,效率相同。
- 类似题目推荐
-
- 合并两个有序数组
-
- 最长公共前缀
-
- 反转字符串中的单词 III
-
五、调试与验证
1. 手动模拟示例(示例 1:word1="abc", word2="pqr")
- i=0, j=0:添加
a→p→ res="ap" - i=1, j=1:添加
b→q→ res="apbq" - i=2, j=2:添加
c→r→ res="apbqcr" - 遍历完成,返回结果。
2. 边界测试用例
- 空字符串:word1="", word2="abc"→ 输出"abc"
- 单字符:word1="a", word2="b" → 输出 "ab"
- 一长一短:word1="abcd", word2="pq" → 输出 "apbqcd"