Rust 中的备用合并字符串算法

问题描述 投票:0回答:1

这是我在 Rust 中替代合并字符串的代码。我没有得到预期的输出。它对于等长的字符串效果很好。问题是,当我们有不相等的字符串时,它会跳过一个字符。

impl Solution {
    pub fn merge_alternately(word1: String, word2: String) -> String {
        let mut merged = String::new();
        let mut chars1 = word1.chars();
        let mut chars2 = word2.chars();

        while let (Some(c1), Some(c2)) = (chars1.next(), chars2.next()) {
            merged.push(c1);
            merged.push(c2);
        }
        // Append any remaining characters from word1
        while let Some(c1) = chars1.next() {
            merged.push(c1);
        }

        // Append any remaining characters from word2
        while let Some(c2) = chars2.next() {
            merged.push(c2);
        }
        merged
    }
}

这是测试用例失败:

输入 单词1 = “ab” 单词2 = “pqrs”

电流输出 “apbqs”

预期产出 “apbqrs”

string algorithm rust merge rust-cargo
1个回答
0
投票

如果两者中只有一个返回字符,则您的

while let (Some(c1), Some(c2))
不匹配。这会导致所述字符被跳过。

您的三个

while let
循环可以合并为一个
loop{match}
,要求正确处理所有情况:

pub fn merge_alternately(word1: String, word2: String) -> String {
    let mut merged = String::new();
    let mut chars1 = word1.chars();
    let mut chars2 = word2.chars();

    loop {
        match (chars1.next(), chars2.next()) {
            (Some(c1), Some(c2)) => merged.extend([c1, c2]),
            (Some(c1), None) => merged.push(c1),
            (None, Some(c2)) => merged.push(c2),
            (None, None) => break,
        }
    }

    merged
}

fn main() {
    let word1 = "ab".to_string();
    let word2 = "pqrs".to_string();

    println!("{}", merge_alternately(word1, word2));
}
apbqrs
© www.soinside.com 2019 - 2024. All rights reserved.