Easy
题目描述
给你两个字符串 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
提示:
1 <= word1.length, word2.length <= 100word1和word2由小写英文字母组成
解题思路
这道题可以使用双指针方法来解决。核心思想是同时遍历两个字符串,交替取字符。
方法一:双指针遍历(推荐)
使用两个指针 i 和 j 分别指向两个字符串的当前位置。在每次迭代中,先添加 word1[i](如果存在),再添加 word2[j](如果存在),然后递增对应的指针。当某个字符串遍历完毕后,将另一个字符串的剩余部分直接追加到结果中。
方法二:统一循环 也可以用一个循环变量同时控制两个字符串的索引,循环条件是两个字符串都没有遍历完。在循环内部检查当前索引是否有效,如果有效就添加对应字符。
两种方法的时间复杂度都是 O(m+n),空间复杂度都是 O(1)(不计算结果字符串的空间)。第一种方法更加直观清晰,推荐使用。
代码实现
class Solution {
public:
string mergeAlternately(string word1, string word2) {
string result;
int i = 0, j = 0;
while (i < word1.length() && j < word2.length()) {
result += word1[i++];
result += word2[j++];
}
// 添加剩余字符
while (i < word1.length()) {
result += word1[i++];
}
while (j < word2.length()) {
result += word2[j++];
}
return result;
}
};
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
result = []
i = j = 0
while i < len(word1) and j < len(word2):
result.append(word1[i])
result.append(word2[j])
i += 1
j += 1
# 添加剩余字符
while i < len(word1):
result.append(word1[i])
i += 1
while j < len(word2):
result.append(word2[j])
j += 1
return ''.join(result)
public class Solution {
public string MergeAlternately(string word1, string word2) {
StringBuilder result = new StringBuilder();
int i = 0, j = 0;
while (i < word1.Length && j < word2.Length) {
result.Append(word1[i++]);
result.Append(word2[j++]);
}
// 添加剩余字符
while (i < word1.Length) {
result.Append(word1[i++]);
}
while (j < word2.Length) {
result.Append(word2[j++]);
}
return result.ToString();
}
}
var mergeAlternately = function(word1, word2) {
let result = '';
let i = 0, j = 0;
while (i < word1.length && j < word2.length) {
result += word1[i++];
result += word2[j++];
}
// 添加剩余字符
while (i < word1.length) {
result += word1[i++];
}
while (j < word2.length) {
result += word2[j++];
}
return result;
};
复杂度分析
| 复杂度 | 分析 |
|---|---|
| 时间复杂度 | O(m + n),其中 m 和 n 分别是 word1 和 word2 的长度 |
| 空间复杂度 | O(1),不计算结果字符串的存储空间 |
相关题目
. Zigzag Iterator (Medium)