Rust实现字符串交替合并:LeetCode 1768题解
发布时间:2026/9/14 5:43:57 锦皓数字建站

1. 问题描述与需求拆解今天我们来解决LeetCode上的1768题交替合并字符串。题目要求给定两个字符串word1和word2通过交替添加字母来合并它们。如果一个字符串比另一个长多出来的字母需要追加到合并结果的末尾。举个例子输入word1 abc, word2 pqr输出apbqcr解释a p b q c r这个题目看似简单但用Rust实现时需要考虑几个关键点Rust字符串是UTF-8编码的不能直接按字节索引需要处理不同长度字符串的情况Rust的所有权机制会影响字符串操作方式2. Rust字符串处理基础2.1 Rust字符串的特点Rust中的String类型是UTF-8编码的可增长字符串与C/C中的字符串有本质区别不能直接用索引访问字符如word1[0]长度计算需要考虑Unicode字符字符串切片操作需要谨慎处理边界let s String::from(你好); println!({}, s.len()); // 输出6而不是22.2 字符迭代方法正确处理Rust字符串的几种方式chars()方法返回Unicode标量值的迭代器char_indices()返回(索引, char)对的迭代器bytes()返回原始字节的迭代器对于本题chars()是最合适的选择for c in word1.chars() { // 处理每个字符 }3. 基础解法实现3.1 算法思路将两个字符串转换为字符迭代器循环从两个迭代器中交替取出字符当任一迭代器耗尽时将剩余字符全部追加3.2 代码实现pub fn merge_alternately(word1: String, word2: String) - String { let mut result String::new(); let mut iter1 word1.chars(); let mut iter2 word2.chars(); loop { match (iter1.next(), iter2.next()) { (Some(c1), Some(c2)) { result.push(c1); result.push(c2); } (Some(c1), None) { result.push(c1); result.extend(iter1); break; } (None, Some(c2)) { result.push(c2); result.extend(iter2); break; } (None, None) break, } } result }3.3 代码解析使用chars()获取两个字符串的迭代器loop循环配合match处理四种可能情况两个迭代器都有值交替添加word1有剩余添加当前字符后追加剩余word2有剩余同上都耗尽退出循环extend方法可以快速追加迭代器剩余元素4. 性能优化方案4.1 预分配字符串容量Rust的String是动态增长的但我们可以预先计算最终长度来避免多次分配pub fn merge_alternately_optimized(word1: String, word2: String) - String { let len word1.len() word2.len(); let mut result String::with_capacity(len); // ...其余代码相同 }4.2 迭代器性能对比我们测试几种不同的迭代方式chars()loop如基础解法zipfor_eachword1.chars().zip(word2.chars()).for_each(|(c1, c2)| { result.push(c1); result.push(c2); });while let模式while let (Some(c1), Some(c2)) (iter1.next(), iter2.next()) { result.push(c1); result.push(c2); }实测发现基础解法的性能最佳因为减少了匹配次数。5. 边界条件处理5.1 空字符串情况word1为空直接返回word2word2为空直接返回word1都为空返回空字符串我们的基础解法已经处理了这些情况但可以添加专门检查if word1.is_empty() { return word2; } if word2.is_empty() { return word1; }5.2 Unicode字符处理Rust的chars()已经正确处理了Unicode但要注意组合字符如é可能是e´代理对某些emoji由两个char组成例如let word1 String::from(café); // é是一个Unicode字符 let word2 String::from(❄️); // 北极熊emoji实际上是两个字符我们的解法能正确处理这些情况因为chars()按Unicode标量值分割。6. 测试用例设计6.1 基础测试#[test] fn test_basic() { assert_eq!( merge_alternately(String::from(abc), String::from(pqr)), apbqcr ); assert_eq!( merge_alternately(String::from(ab), String::from(pqrs)), apbqrs ); assert_eq!( merge_alternately(String::from(abcd), String::from(pq)), apbqcd ); }6.2 边界测试#[test] fn test_edge_cases() { assert_eq!(merge_alternately(String::from(), String::from()), ); assert_eq!(merge_alternately(String::from(), String::from(xyz)), xyz); assert_eq!(merge_alternately(String::from(abc), String::from()), abc); }6.3 Unicode测试#[test] fn test_unicode() { assert_eq!( merge_alternately(String::from(こんにちは), String::from(world)), こwんnにちはorld ); assert_eq!( merge_alternately(String::from(a☀️b), String::from(cd)), ac☀️db ); }7. 与其他语言的对比7.1 Python实现def mergeAlternately(word1: str, word2: str) - str: res [] for a, b in zip(word1, word2): res.append(a) res.append(b) res.extend(word1[len(word2):]) res.extend(word2[len(word1):]) return .join(res)对比Python可以直接索引字符串zip会自动处理不等长情况列表操作更直观但性能可能略低7.2 C实现string mergeAlternately(string word1, string word2) { string res; int i 0; while (i word1.size() || i word2.size()) { if (i word1.size()) res word1[i]; if (i word2.size()) res word2[i]; i; } return res; }对比C可以直接索引需要手动管理循环索引内存分配不如Rust高效8. 实际应用场景这种字符串交替合并的模式在实际开发中有多种应用数据混淆交替合并两个数据流增加分析难度文件合并交替合并两个日志文件保持时间顺序密码学简单的密钥混合方案文本处理生成交替显示的双语对照文本例如实现一个简单的双语对照生成器fn bilingual_text(english: str, chinese: str) - String { let mut result String::new(); let mut en english.chars(); let mut zh chinese.chars(); loop { match (en.next(), zh.next()) { (Some(e), Some(z)) { result.push(e); result.push( ); result.push(z); result.push(\n); } (Some(e), None) { result.push(e); result.push(\n); } (None, Some(z)) { result.push(z); result.push(\n); } (None, None) break, } } result }9. 进阶挑战尝试解决这些变种问题反向交替合并从字符串末尾开始交替N路交替合并合并N个字符串而不是2个条件交替根据字符类型决定合并顺序如先元音后辅音并行合并使用Rayon等库实现并行合并例如N路合并的实现思路fn merge_n(words: VecString) - String { let mut result String::new(); let mut iters: Vec_ words.iter().map(|s| s.chars()).collect(); let mut active true; while active { active false; for iter in mut iters { if let Some(c) iter.next() { result.push(c); active true; } } } result }10. Rust学习建议通过这道题可以学习到Rust字符串处理的核心概念迭代器的强大功能match表达式的灵活使用性能优化的基本思路建议下一步学习更多迭代器适配器方法map, filter, fold等理解Rust的所有权系统如何影响字符串操作练习更多LeetCode字符串题目巩固知识例如可以尝试反转字符串考虑Unicode验证回文串字符串转换整数atoiZ字形变换
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。