carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode884:两句话中的不常见单词(uncommon-words-from-two-sentences) #156

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。

如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。

给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。

 

示例 1:

输入:s1 = "this apple is sweet", s2 = "this apple is sour" 输出:["sweet","sour"] 示例 2:

输入:s1 = "apple apple", s2 = "banana" 输出:["banana"]  

提示:

1 <= s1.length, s2.length <= 200 s1 和 s2 由小写英文字母和空格组成 s1 和 s2 都不含前导或尾随空格 s1 和 s2 中的所有单词间均由单个空格分隔

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/uncommon-words-from-two-sentences

carloscn commented 1 year ago

 问题分析

我的解法

s1和s2字符串以空格split放入同一个str vector中,然后去的进行去重。rust烦人之处在于这个借用规则,一旦被迭代的样本向量进入到迭代,在迭代之中就不能对这个样本进行修改。所以要尽量使用闭包对样本进行修改

fn uncommon_from_sentences(s1: String, s2: String) -> Vec<String>
{
    let mut ret_vec:Vec<String> = vec![];
    let mut s1_vec:Vec<String> = s1.split(" ")
                                   .map(|x| x.to_string())
                                   .collect();

    let mut s1_vec_clone = s1_vec.clone();
    let mut s2_vec:Vec<String> = s2.split(" ")
                                   .map(|x| x.to_string())
                                   .collect();

    s1_vec.retain(|x| !s2_vec.contains(x));
    s2_vec.retain(|x| !s1_vec_clone.contains(x));

    ret_vec.append(&mut s1_vec);
    ret_vec.append(&mut s2_vec);

    return ret_vec;
}
carloscn commented 1 year ago

code

https://github.com/carloscn/structstudy/commit/f58d3cddcee07094bf7d7ffdb5e6e16be2de4e3f https://review.gerrithub.io/c/carloscn/structstudy/+/551310