这是悦乐书的第338次更新,第362篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第207题(顺位题号是884)。我们给出了两个句子A和B。(一个句子是一串空格分隔的单词。每个单词只由小写字母组成。)如果一个单词在其中一个句子中只显示一次,并且不出现在另一个句子中,则该单词不常见。返回所有不常见单词的列表。你可以按任何顺序返回列表。例如:

输入:A = "this apple is sweet", B = "this apple is sour"
输出:["sweet","sour"]

输入:A = "apple apple", B = "banana"
输出:["banana"]

注意

  • 0 <= A.length <= 200

  • 0 <= B.length <= 200

  • A和B都只包含空格和小写字母。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的要求有两点:

  • 出现两次及以上的单词不要,无论在A中还是在B中。

  • A中单词不能出现在B中,B中单词不能出现在A中。

换一种方式来讲,最后的结果字符串数组只要出现一次的单词。所以,我们可以使用HashMap,以每个单词为key,以其出现次数为value,将字符串A、B按照空格拆分为字符串数组,遍历其中的元素,存入HashMap中,接着遍历HashMap,将value值为1的key元素添加进结果数组中,最后返回结果数组。

public String[] uncommonFromSentences(String A, String B) {
    List<String> result = new ArrayList<String>();
    Map<String, Integer> map = new HashMap<String, Integer>();
    String[] arr = A.split(" ");
    for (String str : arr) {
        map.put(str, map.getOrDefault(str, 0)+1);
    }
    String[] arr2 = B.split(" ");
    for (String str : arr2) {
        map.put(str, map.getOrDefault(str, 0)+1);
    }
    for (String key : map.keySet()) {
        if (map.get(key) == 1) {
            result.add(key);
        }
    }
    return result.toArray(new String[result.size()]);
}


03 第二种解法

我们也可以将字符串A和B连接在一起,只使用一个for循环来处理单词,其他思路不变。

public String[] uncommonFromSentences2(String A, String B) {
    List<String> result = new ArrayList<String>();
    Map<String, Integer> map = new HashMap<String, Integer>();
    String[] arr = (A+" "+B).split(" ");
    for (String str : arr) {
        if (!str.isEmpty()) {
            map.put(str, map.getOrDefault(str, 0)+1);
        }
    }
    for (String key : map.keySet()) {
        if (map.get(key) == 1) {
            result.add(key);
        }
    }
    return result.toArray(new String[result.size()]);
}


04 小结

算法专题目前已连续日更超过六个月,算法题文章207+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!