You are given two strings word1 and word2. Merge the strings by adding letters in alternating order, starting with word1. If a string is longer than the other, append the additional letters onto the end of the merged string.
Example:
Input: word1 = "abc", word2 = "pqr"
Output: "apbqcr"
Input: word1 = "ab", word2 = "pqrs"
Output: "apbqrs"
Input: word1 = "abcd", word2 = "pq"
Output: "apbqcd"
问题
给定两个字符串 word1 和 word2。通过交替添加字母来合并字符串,从 word1 开始。如果一个字符串比另一个长,则将附加的字母追加到合并后的字符串末尾。
解决方案 1
使用双指针方法,遍历两个字符串并交替添加字符。
Approach 1 / 方法 1
使用双指针,依次从两个字符串中交替取字符,直到至少一个字符串到达末尾。然后将剩余的字符追加到结果字符串末尾。
Detailed Steps / 详细步骤
Initialization / 初始化:
- Initialize pointers for both strings and an empty result string.
初始化两个字符串的指针和一个空的结果字符串。
Step 1 / 第一步:
- Iterate through both strings simultaneously, adding one character from each string to the result string.
同时遍历两个字符串,从每个字符串中各添加一个字符到结果字符串。
Step 2 / 第二步:
- Check if there are remaining characters in either string and append them to the result string.
检查任一字符串是否有剩余字符并将它们追加到结果字符串。
Implementation / 实现
python
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
merged = []
i, j = 0, 0
while i < len(word1) and j < len(word2):
merged.append(word1[i])
merged.append(word2[j])
i += 1
j += 1
while i < len(word1):
merged.append(word1[i])
i += 1
while j < len(word2):
merged.append(word2[j])
j += 1
return ''.join(merged)
Explanation / 解释
- Step 1 / 第一步:
- Initialize an empty list
mergedand two pointersiandj.
初始化一个空列表merged和两个指针i和j。
- Step 2 / 第二步:
- Traverse both strings using the pointers, adding one character from each string to
merged.
使用指针遍历两个字符串,从每个字符串中各添加一个字符到merged。
- Step 3 / 第三步:
- Append any remaining characters from either string to
merged.
将任一字符串中剩余的字符追加到merged。
Complexity Analysis / 复杂度分析
-
Time Complexity: O(M + N), where M and N are the lengths of
word1andword2.
时间复杂度: O(M + N),其中 M 和 N 分别是word1和word2的长度。 -
Space Complexity: O(M + N), to store the result.
空间复杂度: O(M + N),用于存储结果。
Key Concept / 关键概念
- The key concept is to use two pointers to merge the strings by alternating characters from each string.
关键概念是使用双指针通过交替添加字符来合并字符串。
解决方案 2
通过递归方法合并字符串。
Approach 2 / 方法 2
使用递归方法,在递归过程中依次从两个字符串中取字符。
Detailed Steps / 详细步骤
Initialization / 初始化:
- Define a recursive function to merge strings alternately.
定义一个递归函数来交替合并字符串。
Step 1 / 第一步:
- In each recursive call, add one character from each string to the result.
在每次递归调用中,从每个字符串中各添加一个字符到结果。
Step 2 / 第二步:
- Recur with the remaining parts of the strings.
用剩余部分的字符串进行递归。
Implementation / 实现
python
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
if not word1:
return word2
if not word2:
return word1
return word1[0] + word2[0] + self.mergeAlternately(word1[1:], word2[1:])
Explanation / 解释
- Step 1 / 第一步:
- Base case: if one string is empty, return the other string.
基本情况:如果一个字符串为空,则返回另一个字符串。
- Step 2 / 第二步:
- Add the first character of both strings to the result and recur for the remaining parts of the strings.
将两个字符串的第一个字符添加到结果中,并对字符串的剩余部分进行递归。
Complexity Analysis / 复杂度分析
-
Time Complexity: O(M + N)
时间复杂度: O(M + N) -
Space Complexity: O(M + N)
空间复杂度: O(M + N)
Key Concept / 关键概念
- The key concept is to use recursion to merge strings by alternating characters.
关键概念是使用递归通过交替添加字符来合并字符串。
Tips / 提示
- Ensure that you handle cases where one string is longer than the other.
确保处理一个字符串比另一个字符串长的情况。
Solution Template for similar questions / 提示
- The approach can be applied to other problems involving merging or interleaving two sequences.
该方法可以应用于涉及合并或交错两个序列的其他问题。
Recommended 5 more similar questions to help user practice / 推荐5问题
- LeetCode 921: Minimum Add to Make Parentheses Valid
- LeetCode 1089: Duplicate Zeros
- LeetCode 1764: Form Array by Concatenating Subarrays of Another Array
- LeetCode 88: Merge Sorted Array
- LeetCode 986: Interval List Intersections
Recommended more online resource to help user practice.
- LeetCode Explore – String
- GeeksforGeeks – String Data Structure
- InterviewBit – String Interview Questions
- Leetcode 75
More
zip_longest function
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
return ''.join(a + b for a, b in zip_longest(word1, word2, fillvalue=''))
Purpose of the Code
The purpose of this function mergeAlternately is to take two strings, word1 and word2, and merge them by alternating characters from each string. If one string is shorter, the remaining characters from the longer string are appended to the result.
Breakdown of the Code
-
Function Definition:
def mergeAlternately(self, word1: str, word2: str) -> str:mergeAlternatelyis a method of theSolutionclass.- It takes two arguments,
word1andword2, both of which are expected to be strings (str). - The method returns a string, as indicated by the return type annotation
-> str.
-
Using
zip_longest:return ''.join(a + b for a, b in zip_longest(word1, word2, fillvalue=''))- The
zip_longestfunction is imported from theitertoolsmodule, which is not shown here but is a standard Python library function. zip_longestis similar to thezipfunction, but it can handle input iterables (like strings) of different lengths.- When using
zip, if the input iterables are of unequal lengths, it stops when the shortest iterable is exhausted. However,zip_longestcontinues until the longest iterable is exhausted, filling in the missing values with a specifiedfillvalue.
- The
-
Merging the Strings:
- The expression
zip_longest(word1, word2, fillvalue='')pairs elements fromword1andword2. - If
word1is longer thanword2, the remaining characters ofword1will be paired with thefillvalue, which is an empty string''. - Similarly, if
word2is longer thanword1, its remaining characters will be paired with''.
- The expression
-
Generating the Result:
- The list comprehension
a + b for a, b in zip_longest(word1, word2, fillvalue='')iterates over the paired elements returned byzip_longest. - For each pair
(a, b), it concatenatesaandb. - These concatenated pairs are then joined together into a single string using
''.join(...).
- The list comprehension
-
Return Value:
- The final result is a string where characters from
word1andword2are alternated. If one string is shorter, the remaining characters from the longer string are added at the end.
- The final result is a string where characters from
Example
Let’s go through an example to see how this works in practice.
word1 = "abc"
word2 = "defgh"
zip_longest(word1, word2, fillvalue='')will generate:('a', 'd'), ('b', 'e'), ('c', 'f'), ('', 'g'), ('', 'h')- The list comprehension generates:
'ad', 'be', 'cf', 'g', 'h' - Finally,
''.join(...)concatenates these strings into:"adbecfgh"
So, the result of mergeAlternately("abc", "defgh") is "adbecfgh".
Key Concepts
zip_longest: This function is crucial for handling cases where the input strings have different lengths, ensuring that no characters are left out in the final merged string.- String Concatenation: The approach effectively combines characters from both strings, ensuring the desired alternating pattern.
- Edge Cases: The code handles cases where one or both strings might be empty, thanks to the use of
fillvalue=''inzip_longest.
Final Thoughts
This method provides an elegant and concise way to merge two strings alternately, using Python’s powerful itertools.zip_longest function and string manipulation techniques. The code is efficient and handles edge cases well, making it a robust solution for the problem at hand.
Recommend Resource:
Merge Strings Alternately – Leetcode 1768 – Python by NeetCodeIO
Leave a Reply to admin Cancel reply