当前位置: 首页 > article >正文

每日一题|2306. 公司命名|哈希映射、集合运算

本题可以预想暴力解法是遍历整个数组,分别进行匹配,这样的复杂度是O(n^2),必然超时。

所以想到如何进行时间上的简化。

对于遍历进行求解,时间主要消耗在“模拟这个过程上”,也就是真的去匹配,而没有关注到题目让求解到仅仅是“数量”。也就是说,如果能够直接从数量上进行运算,将会很方便,也很高效。

对于一个数组内的两个元素,strA和strB,交换它们的首字母后,对应的分别是pre_A + suf_B 和 pre_B + suf_A。那么我们扩展数量,preA在数组中有a个后缀,preB在数组中有b个后缀(pre_A不等于pre_B)。也就是说pre_A可以引导一个集合A,数量是a;pre_B可以引导一个集合,B数量是b。

此时,问题已经转化为数量上的计算。

那么对于A而言,如果交换到pre_B引导,则能够有效的后缀数量是B的数量减去A和B交集的数量。或者说交换后有效的集合是B - (A&B)。同理,B交换到A仍然有效的数量是A - (A&B)。

那么此时,两个集合是等价的,其中每一个配对,都构成一个有效的题目所求的名字组合。

注意,我们要求的仍然是数量,所以ans_(A,B) = |B - (A&B)| * |A - (A&B)|。遍历全部的A和B组合即可。

1.构建哈希映射关系

构建由前缀作为key,后缀作为value的哈希。这里采用字典的方式,默认值位空集合set。

        names = defaultdict(set)
        for idea in ideas:
            names[idea[0]].add(idea[1:])

2.遍历所有可能的前缀组合

        for pre_a, set_a in names.items():
            for pre_b, set_b in names.items():
                if pre_a == pre_b:
                    continue
                else:
                    intersect = set_a & set_b  # 交集运算
                    ans += (len(set_a) - len(intersect)) * (len(set_b) - len(intersect))

这里注意集合运算&表示交集的写法。

完整代码如下:

class Solution(object):
    def distinctNames(self, ideas):
        """
        :type ideas: List[str]
        :rtype: int
        """
        names = defaultdict(set)
        for idea in ideas:
            names[idea[0]].add(idea[1:])
        
        ans = 0
        for pre_a, set_a in names.items():
            for pre_b, set_b in names.items():
                if pre_a == pre_b:
                    continue
                else:
                    intersect = set_a & set_b  # 交集运算
                    ans += (len(set_a) - len(intersect)) * (len(set_b) - len(intersect))
        return ans

http://www.kler.cn/news/319510.html

相关文章:

  • FastAPI挂载静态资源
  • 单词记忆的化境:用思想的流水去淹没坚硬的石块
  • 【网络安全】网络基础第一阶段——第四节:网络协议基础---- VRRP与网络架构设计
  • 三种springboot启动时加载方式
  • 使用Renesas R7FA8D1BH (Cortex®-M85)和微信小程序App数据传输
  • 黑盒测试 | 挖掘.NET程序中的反序列化漏洞
  • 统信服务器操作系统【d版系统上Ansible工具】配置方法
  • MySQL:表的约束
  • 2.Seata 1.5.2 集成Springcloud-alibaba
  • 【算法】贪心+堆排序实现大根堆及标准库容器类的融合使用
  • python 2024-10
  • Angular面试题八
  • 13.第二阶段x86游戏实战2-动态模块地址
  • Unicode编码如何转换为汉字
  • DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞
  • 仓颉编程入门2,启动HTTP服务
  • 基于数据挖掘的航空客户满意度分析预测系统
  • 安卓系统常见问题如native crash,卡顿卡死定位工具命令技巧-android framework实战开发
  • Java_Day05学习
  • 搜维尔科技:通过xsens动作捕捉为影视角色注入生命
  • 前端框架的对比和选择
  • MySQL备份与恢复详解
  • Anaconda/Miniconda的删除和安装
  • rapidocr 提取汇总
  • 可以写自动化测试工具的AI工具
  • [笔记]交流接触器
  • UR机器人坐标系转化
  • C++系列-Stackqueue
  • Qt中多语言的操作(以QtCreator为例)
  • Android个性名片界面的设计——约束布局的应用