📘 題目敘述
給定兩個字串 word1 與 word2,請依序從 word1 與 word2 各取一個字元交錯合併成一個新字串。
若其中一個字串較長,則在另一個字串用完後,將剩餘的字元直接接在結果字串後面。
條件限制
1 ≤ word1.length, word2.length ≤ 100word1與word2僅包含小寫英文字母
🧠 解題思路
我的做法是:
- 每次都從
word1與word2的「最前面」各取一個字元 - 把這兩個字元依序接到結果字串後面
- 同時把已經使用過的字元從原字串中移除
- 重複這個過程,直到其中一個字串用完
- 最後再把剩下的字串整段接到結果後面
所有變數(對應程式碼)
word:最後要回傳的合併結果字串word1:尚未被合併的第一個字串word2:尚未被合併的第二個字串l1:目前word1剩餘的字元數l2:目前word2剩餘的字元數
while (l1 != 0 && l2 != 0):兩個字串都還有字元時
這個迴圈代表:
- 只要
word1與word2都還沒用完 - 就可以繼續「交錯」從兩邊各取一個字元
第一步:各取一個字元接到結果後面
word = word + word1[0] + word2[0];
這一行做的事情是:
- 先取出 word1 的第一個字元
word1[0] - 再取出 word2 的第一個字元
word2[0] - 依照順序把這兩個字元接到結果字串 word 後面
這正好對應題目要求的「交錯合併」。
第二步:移除已經使用過的字元
word1 = word1.erase(0, 1);
word2 = word2.erase(0, 1);
這兩行的作用是:
- 把 word1 與 word2 各自已經使用過的第一個字元刪掉
- 讓下一輪迴圈時,新的第一個字元就是「尚未使用」的部分
第三步:更新剩餘長度
l1 = l1 - 1;
l2 = l2 - 1;
每次取走一個字元,就同步更新剩餘長度,確保 while 條件能正確判斷是否還能繼續交錯合併。
while 結束後:其中一個字串已經用完
當 while 迴圈結束時,代表:
- word1 或 word2 至少有一個已經沒有剩餘字元
- 但另一個字串可能還有尚未合併的部分
將剩餘字串直接接到結果後面:
word = word + word1;
word = word + word2;
若 word1 已經是空字串,這一行不會有任何影響;若 word2 已經是空字串,同樣不影響結果。
最後回傳結果,回傳已經完成交錯合併的字串。
💻 程式碼實作
class Solution {
public:
string mergeAlternately(string word1, string word2) {
string word = "";
int l1 = word1.size(), l2 = word2.size();
while (l1 != 0 && l2 != 0) {
word = word + word1[0] + word2[0];
word1 = word1.erase(0, 1);
word2 = word2.erase(0, 1);
l1 = l1 - 1;
l2 = l2 - 1;
}
word = word + word1;
word = word + word2;
return word;
}
};
🔗 題目連結
https://leetcode.com/problems/merge-strings-alternately/