1768.交替合并字符串
难度:🟢 简单
标签:字符串
、双指针
题目描述
给你两个字符串 word1
和 word2
。请你从 word1
开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
示例 1:
输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1: a b c
word2: p q r
合并后: a p b q c r
示例 2:
输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1: a b
word2: p q r s
合并后: a p b q r s
示例 3:
输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1: a b c d
word2: p q
合并后: a p b q c d
解题思路
核心思想
本题的核心是按照“一前一后”的交替顺序合并两个字符串的字符,直到其中一个字符串被完全取完,然后将另一个字符串的剩余部分直接追加到末尾。
思路选择
双指针法 是解决此问题最直观、最高效的思路。
我们使用两个指针
p1
和p2
,分别指向word1
和word2
的当前待处理字符。在一个循环中,只要两个指针中还有一个在有效范围内,我们就继续合并。
在循环内部,我们先检查
p1
是否有效,如果有效,就追加word1[p1]
并移动p1
。然后用同样的方式处理p2
。当一个指针越界后,后续的循环只会处理另一个未越界的指针,自然地实现了将剩余部分追加到末尾的效果。
关键步骤
初始化:初始化两个指针
p1 = 0
,p2 = 0
,以及一个结果数组result
(使用数组比字符串直接拼接效率更高)。循环条件:当
p1
小于word1
的长度 或p2
小于word2
的长度时,持续循环。交替追加: a. 如果
p1
未越界,将word1[p1]
推入result
数组,然后p1++
。 b. 如果p2
未越界,将word2[p2]
推入result
数组,然后p2++
。返回结果:循环结束后,将
result
数组中的所有字符连接成一个字符串并返回。
代码实现
/**
* @param {string} word1
* @param {string} word2
* @return {string}
*/
var mergeAlternately = function(word1, word2) {
const result = [];
let p1 = 0, p2 = 0;
// 只要还有一个指针在界内,就继续
while (p1 < word1.length || p2 < word2.length) {
// 如果 word1 还有字符,添加它
if (p1 < word1.length) {
result.push(word1[p1]);
p1++;
}
// 如果 word2 还有字符,添加它
if (p2 < word2.length) {
result.push(word2[p2]);
p2++;
}
}
return result.join('');
};
复杂度分析
时间复杂度:O(m + n) 其中 m 和 n 分别是两个输入字符串的长度。我们需要完整地遍历两个字符串。
空间复杂度:O(m + n) 我们需要一个额外的空间来存储合并后的结果字符串。
相关题目
总结
本题是双指针思想的入门级应用。通过为每个输入源维护一个独立的指针,并在一个统一的循环中处理它们,可以非常清晰、高效地解决合并或比较类的问题。