[閒聊] 每日leetcode 75 - Day1

作者: yam276 ('_')   2025-05-27 18:38:46
1768. Merge Strings Alternately
https://leetcode.com/problems/merge-strings-alternately/
題意:
兩個字串 word1, word2 讓他們的字元交錯組合成新字串
思路:
這一題比較簡單 所以可以來挑戰 Rust 鏈式方法
那如果你用普通的鏈式思路
會發現兩個字串沒辦法輪流遍歷
所以要先組合起來
用 .zip() 方法:
word1.chars().zip(word2.chars())
這樣會得到一個 (word1, word2) 的 iterator
之後本來是要用 .map()
但會遇到問題 .map() 會回傳 Iterator<Iterator<T>>
不符合需求 所以改用 .flat_map()
這方法會把東西壓成同一個 Iterator 陣列:
.flat_map(|(c1, c2)| std::iter::once(c1).chain(std::iter::once(c2)))
用 std::iter::once() 是因為這個比較省空間
用 vec! 跟 .into_iter() 都會有額外的 heap 分配:
let i1 = std::iter::once('a'); // 更輕量
let i2 = vec!['a'].into_iter(); // 多了一層 heap 分配
我們串接完之後會遇到一個問題
就是 .zip() 會捨棄 多餘的部分
所以要另外加上 word1/word2 去除對方長度的部分
做兩次是因為不確定誰比較長
.chain(word1.chars().skip(word2.chars().count()))
.chain(word2.chars().skip(word1.chars().count()))
最後把展開的 Iterator 收束
.collect()
這解法空間複雜度不是最好
但是可以學鏈式串接用法
Code:
impl Solution {
pub fn merge_alternately(word1: String, word2: String) -> String {
word1
.chars()
.zip(word2.chars())
.flat_map(|(c1, c2)| std::iter::once(c1)
.chain(std::iter::once(c2)))
.chain(word1.chars().skip(word2.chars().count()))
.chain(word2.chars().skip(word1.chars().count()))
.collect()
}
}
作者: sustainer123 (caster)   2025-05-27 18:55:00
大佬
作者: DJYOMIYAHINA (通通打死)   2025-05-27 19:00:00
= =大師...

Links booklink

Contact Us: admin [ a t ] ucptt.com