Rust-字符串交替合并
此需求来源于实际的工作场景。后发现在 Leetcode 上面也有这样的题目,我个人不喜欢 Leetcode,但是既然有了也方便提供题目描述,于是就干脆记录一下。
本身算法不复杂,属于 Easy 级别的题目。算是当成一个自己的小抄吧。
题目描述
英文题源:点我 : Leetcode-1768
中文题源:点我 : Leetcode-1768
题目描述:
给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。 如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回合并后的字符串
示例 1:
输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1: a b c
word2: p q r
合并后: a p b q c r
示例 2:
输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1: a b
word2: p q r s
合并后: a p b q r s
示例 3:
输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1: a b c d
word2: p q
合并后: a p b q c d
题目解法
本质上思路比较简单,就不再赘述。直接贴代码:
fn main() {
assert_eq!(
"a1b2c3def",
merge_alternately("abcdef".to_string(), "123".to_string())
);
assert_eq!(
"a1b2c3456",
merge_alternately("abc".to_string(), "123456".to_string())
);
}
pub fn merge_alternately(word1: String, word2: String) -> String {
let mut ans = String::new();
let mut i = 0;
let mut j = 0;
while i < word1.len() || j < word2.len() {
if let Some(c) = word1.chars().nth(i) {
ans.push(c);
}
if let Some(c) = word2.chars().nth(i) {
ans.push(c);
}
i += 1;
j += 1;
}
ans
}
后续更新
20210520 更新: 后来又意外发现了一个 crate 名为itertools的库,它可以替我们做很多事情。
比如 merge 操作、带 ordering 的 merge 操作,笛卡尔积 product 操作,以及本文涉及的 interleave 操作。
那么有了 itertools 的辅助,即可短暂地实现 interleave 的操作。
代码如下:
use itertools::Itertools;
fn main() {
assert_eq!(
"a1b2c3def",
merge_alternately_itertools("abcdef".to_string(), "123".to_string())
);
assert_eq!(
"a1b2c3456",
merge_alternately_itertools("abc".to_string(), "123456".to_string())
);
}
// 为了方便理解,此处不简化为rust风格的代码
pub fn merge_alternately_itertools(word1: String, word2: String) -> String {
let mut ans = String::new();
ans = word1.chars().interleave(word2.chars()).collect();
ans
}
The End