rust 中替代合并字符串的算法

Algorithm for Alternate merge strings in rust

提问人:Hamza Sajid 提问时间:10/8/2023 最后编辑:cafce25Hamza Sajid 更新时间:10/8/2023 访问量:52

问:

这是我在 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
    }
}

以下是测试用例失败:

输入 word1 = “ab” word2 = “PQRS”

电流输出 “APBQS”

预期输出 “APBQRS”

字符串 算法 merge rust-cargo

评论

2赞 user4815162342 10/8/2023
当你的第一个循环以 结尾时,你会丢弃角色并失去它。(None, Some(..)
1赞 Hamza Sajid 10/8/2023
替换为这个简单的解决方案: 'code' loop{ let chars1 = chars1_iter.next(); let chars2 = chars2_iter.next(); if let Some(i) = chars1 { merged.push(i); } if let Some(i) = chars2 { merged.push(i); } if chars1.is_none() && chars2.is_none() { break } }
1赞 cafce25 10/8/2023
@HamzaSajid如果这解决了你的问题,你应该把它作为一个答案(使用下面的框。如果要澄清您的问题,您应该对其进行编辑,而不是将信息添加为评论。
1赞 user4815162342 10/8/2023
考虑在一个很好的声明中统一这些。match
0赞 Finomnis 10/8/2023
我强烈建议您学习如何使用调试器单步执行代码。当一步一步地看到底发生了什么时,很明显出了什么问题。

答:

1赞 Finomnis 10/8/2023 #1

如果两者中只有一个返回字符,则 Your 不匹配。这会导致跳过所述字符。while let (Some(c1), Some(c2))

你的三个循环可以合并为一个,要求所有情况都得到妥善处理:while letloop{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() {
    println!("{}", merge_alternately("ab".into(), "pqrs".into()));
}
apbqrs

此外,如果你被允许使用库,那么迭代器的标准库就是 itertools。它有一个 .interleave() 函数,可以完全满足您的需求:

use itertools::Itertools;

pub fn merge_alternately(word1: String, word2: String) -> String {
    word1.chars().interleave(word2.chars()).collect()
}

fn main() {
    println!("{}", merge_alternately("ab".into(), "pqrs".into()));
}
apbqrs