解題說明
Merge Strings Alternately
題目描述:給定兩個字串 word1 和 word2,將它們的字元交替合併:先取 word1 的第一個字元,再取 word2 的第一個字元,依此類推。若其中一個字串比另一個長,則把剩餘部分附加在結果末尾。
解題思路:使用雙指標 i、j 分別追蹤兩個字串的當前位置。每輪迭代先從 word1 取一個字元(若 i 仍在範圍內),再從 word2 取一個字元(若 j 仍在範圍內),直到兩者都耗盡。最後將結果字串回傳。
C++ 解法
複雜度分析
時間複雜度:O(m + n) — 遍歷兩個字串各一次,其中 m、n 分別為 word1 和 word2 的長度。
空間複雜度:O(m + n) — 結果字串長度為 m + n。
虛擬碼
1. Initialize i = 0, j = 0, result = "" 2. While i < len(word1) OR j < len(word2): a. If i < len(word1): append word1[i] to result, i++ b. If j < len(word2): append word2[j] to result, j++ 3. Return result
其他解法
min-length 迴圈 + 後處理:先迴圈到較短字串結束,交替附加字元;再將較長字串的剩餘部分一次性附加。邏輯更清晰,程式碼稍長但易讀。
zip 風格(for 迴圈):以 min(m, n) 為迴圈上界,同時取兩字串字元;迴圈後 result += word1.substr(i) + word2.substr(j)。效果相同,略微減少條件判斷次數。
延伸思考
- 若要將 k 個字串交替合併(輪流從每個字串各取一個字元),應如何擴展演算法?
- 若兩個字串的合併必須保持「字典序最小」,但仍要交替取字元,策略會有何不同?
- 本題的空間複雜度能否降至 O(1)(原地合併)?在 C++ 的
std::string中有哪些限制?