当前位置:首页 > 力扣 > 力扣2085题解析:统计两个数组中只出现一次的公共单词数目详解

力扣2085题解析:统计两个数组中只出现一次的公共单词数目详解

24小时前

力扣2085题解析:统计两个数组中只出现一次的公共单词数目详解 力扣2085题解析 哈希表统计 公共单词数目 算法优化 代码实现 第1张

一、题目解读

力扣2085题要求给定两个字符串数组words1和words2,统计两个数组中只出现一次的公共单词的数量。例如,若words1包含["a", "b", "c", "c"],words2包含["c", "d", "e", "e"],则公共单词仅有"c"且仅各出现一次,答案为1。题目关键在于识别单次出现的公共元素,需高效处理重复与交集问题。

二、解题思路

采用哈希表统计 + 交集计算的策略,核心思路分为三步:

1. 使用unordered_map分别统计words1和words2中每个单词的出现次数;

2. 筛选两个数组中仅出现一次的单词,存入unordered_set(利用集合的唯一性);

3. 遍历其中一个集合,检查另一个集合是否存在该单词,计数交集大小。

此解法巧妙利用哈希表O(1)的查询优势,避免重复遍历,时间复杂度优化至O(n)。

三、解题步骤

1. 统计单词频次:创建count1和count2,循环遍历words1和words2,用哈希表记录每个单词的出现次数(如count1["a"]++)。

2. 筛选单次单词:遍历count1和count2,仅当次数为1时(cnt == 1),将单词加入once1和once2集合。

3. 计算交集数量:遍历once1,若once2中存在相同单词(once2.count(word)),则结果result++。

此步骤通过集合的快速查找(O(1))实现交集统计,降低复杂度。

四、代码及注释

#include <vector>
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;

class Solution {
public:
    int countWords(vector<string>& words1, vector<string>& words2) {
        // 统计words1中每个单词的出现次数
        unordered_map<string, int> count1;
        for (const string& word : words1) {  // 利用引用避免复制
            count1[word]++;               // 频次累加
        }
        
        // 统计words2中每个单词的出现次数
        unordered_map<string, int> count2;
        for (const string& word : words2) {
            count2[word]++;
        }
        
        // 收集words1中只出现一次的单词
        unordered_set<string> once1;
        for (const auto& [word, cnt] : count1) {  // C++17结构化绑定
            if (cnt == 1) {
                once1.insert(word);          // 加入集合
            }
        }
        
        // 收集words2中只出现一次的单词
        unordered_set<string> once2;
        for (const auto& [word, cnt] : count2) {
            if (cnt == 1) {
                once2.insert(word);
            }
        }
        
        // 计算两个集合的交集大小
        int result = 0;
        for (const string& word : once1) {
            if (once2.count(word)) {         // 判断是否存在于once2
                result++;                   // 交集计数
            }
        }
        
        return result;
    }
};

注释说明:

● 使用哈希表(unordered_map)高效统计频次;

● 利用unordered_set存储单次单词,避免重复判断;

● 交集计算通过count(word)方法实现快速查找。

五、总结

本解法通过哈希表与集合的组合,将时间复杂度优化至线性级别,适用于大规模数据场景。关键点在于:

1. 频次统计为后续筛选提供基础;

2. 集合的交集查找取代双重遍历,提升效率。

建议读者进一步练习哈希表应用,探索其他解法(如排序 + 双指针)的优劣对比,深化算法理解。

原创内容 转载请注明出处

分享给朋友:

相关文章

2024年CSP-S决斗题(P11231)解题代码分析与优化指南——洛谷竞赛算法实践

2024年CSP-S决斗题(P11231)解题代码分析与优化指南——洛谷竞赛算法实践

一、题目解读    2024年CSP-S中的“决斗”题目(洛谷P11231)要求解决一个数组元素对决的问题:给定一个整数数组,每次对决中,相邻元素若数值不同则双...

【NOIP 2023】词典题(洛谷P9868)解题思路与代码实现详解

【NOIP 2023】词典题(洛谷P9868)解题思路与代码实现详解

一、题目解读2023年NOIP中的词典题(洛谷P9868)要求判断给定n个单词是否存在一种字典序排列,使得每个单词在排序后都不包含另一个单词。题目核心在于理解字典序与字符包含关系的约束,需通过高效算法...

力扣2771题解析:双数组动态规划求解最长非递减子数组问题

力扣2771题解析:双数组动态规划求解最长非递减子数组问题

一、题目解读力扣2771题要求从两个整数数组nums1和nums2中合并元素,寻找最长非递减子数组的长度。非递减子数组指元素单调递增或相等的连续序列。题目难点在于需同时考虑两个数组的交互关系,找到全局...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。