【LeetCode】两句话中的不常见单词Java题解

150 阅读2分钟

这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

题目描述

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

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

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


示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/uncommon-words-from-two-sentences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法每日一题是字符串处理题目,题目对不常见的单词的定义是如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。 根据这个条件,我们可以使用 hashmap 分别统计 s1, s2 中出现的单词和频率,然后比较找出出现一次的单词,这里需要注意,因为 s1, s2 没有顺序,所以需要分别由 s1 查找 s2 中出现一次的不常见单词,由 s2 查找 s1 中出现的不常见单词。具体实现如下:

通过代码

class Solution {
    public String[] uncommonFromSentences(String s1, String s2) {
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        for (String s : s1.split(" ")) {
            map1.put(s, map1.getOrDefault(s, 0) + 1);
        }
        for (String s : s2.split(" ")) {
            map2.put(s, map2.getOrDefault(s, 0) + 1);
        }
        List<String> ansList = new ArrayList<>();
        for (Map.Entry<String, Integer> entry1 : map1.entrySet()) {
            if (entry1.getValue() == 1 && !map2.containsKey(entry1.getKey())) {
                ansList.add(entry1.getKey());
            }
        }

        for (Map.Entry<String, Integer> entry2 : map2.entrySet()) {
            if (entry2.getValue() == 1 && !map1.containsKey(entry2.getKey())) {
                ansList.add(entry2.getKey());
            }
        }

        String[] ans = new String[ansList.size()];
        for (int i = 0; i < ansList.size(); i++) {
            ans[i] = ansList.get(i);
        }   

        return ans;
        
    }
}
  • 上述的解法使用了两个 hashMap, 我们也可以使用一个 hashMap, 记录每个单词出现的频率。遍历一次即可求出答案。 优化如下:
    public String[] uncommonFromSentences(String s1, String s2) {
        Map<String, Integer> map = new HashMap<>();
        for (String s : s1.split(" ")) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }
        for (String s : s2.split(" ")) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }
        List<String> ansList = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                ansList.add(entry.getKey());
            }
        }

        return ansList.toArray(new String[0]);
        
    }

image.png

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!