力扣刷题之2306.公司命名

news2024/9/29 13:11:01

题干描述

给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下:

  1. 从 ideas 中选择 2 个 不同 名字,称为 ideaA 和 ideaB 。
  2. 交换 ideaA 和 ideaB 的首字母。
  3. 如果得到的两个新名字  不在 ideas 中,那么 ideaA ideaB串联 ideaA 和 ideaB ,中间用一个空格分隔)是一个有效的公司名字。
  4. 否则,不是一个有效的名字。

返回 不同 且有效的公司名字的数目。

示例 1:

输入:ideas = ["coffee","donuts","time","toffee"]
输出:6
解释:下面列出一些有效的选择方案:
- ("coffee", "donuts"):对应的公司名字是 "doffee conuts" 。
- ("donuts", "coffee"):对应的公司名字是 "conuts doffee" 。
- ("donuts", "time"):对应的公司名字是 "tonuts dime" 。
- ("donuts", "toffee"):对应的公司名字是 "tonuts doffee" 。
- ("time", "donuts"):对应的公司名字是 "dime tonuts" 。
- ("toffee", "donuts"):对应的公司名字是 "doffee tonuts" 。
因此,总共有 6 个不同的公司名字。

下面列出一些无效的选择方案:
- ("coffee", "time"):在原数组中存在交换后形成的名字 "toffee" 。
- ("time", "toffee"):在原数组中存在交换后形成的两个名字。
- ("coffee", "toffee"):在原数组中存在交换后形成的两个名字。

示例 2:

输入:ideas = ["lack","back"]
输出:0
解释:不存在有效的选择方案。因此,返回 0 。

题干分析 

         已知该算法题的目标是计算可以生成的不同名称组合的数量。具体来说就是给定一组字符串“ideas”,每个字符串可以通过交换首字母的的方式与另一个字符串组合形成新的字符串对。要求计算总共可以生成多少个不同的字符串对,且这两个字符串组合后形成的新字符串不能出现在原始的字符串列表中。

解题思路

 1.分组处理:
  • 将所有的字符串按照他们的首字母进行分类。假设字符串有26个字母组成,可以将所有字符串按首字母a-z分成26个组。每组中的字符串去掉首字母后,只保留其余部分。
2.交集与组合计算:
  • 对每一组,将其与其他组进行比较,找出可以交换的字符串对。
  • 如果两个组有相同的尾部字符串,则这些字符串不能进行交换。因此我们需要计算两组间尾部字符串的交集大小。
  • 对于没有交集的字符串对,恶意直接交换首字母,生成合法的字符串对。 
 3.使用哈希表
  • 为了快速查找和操作相同尾部的字符串,使用哈希表来存储去掉首字母后的字符串。通过比较两个哈希表中的字符串,计算每两个组间的交集。

 详细步骤

 1.创建哈希表
  • 我们为每个首字母维护一个哈希表,哈希表中的key为去掉首字母后的字符串,value可以是一个空值,因为我们只关心字符串是否存在。
 2.遍历每一个字符串
  • 根据字符串的首字母,将其分类到对应的哈希表,哈希表的key是去掉首字母后的字符串。
3.两两组比较
  • 计算组之间的交集大小,即两个哈希表中相同的字符串数目。
  • 计算两个组之间可以生成的不同字符串对数。
 4.结果累加
  • 累加所有合法字符串对的数量。
5.释放内存
  • 遍历结束后,释放所有哈希表的内存。

代码解释 

#define MAX_STR_SIZE 16

typedef struct {
    char key[MAX_STR_SIZE];  // 字符串的key,存放去掉首字母后的字符串
    UT_hash_handle hh;  // 哈希表句柄
} HashItem; 

// 查找哈希表中的指定key项
HashItem *hashFindItem(HashItem **obj, const char* key) {
    HashItem *pEntry = NULL;
    HASH_FIND_STR(*obj, key, pEntry);  // 在哈希表中查找指定key
    return pEntry;
}

// 向哈希表中添加一个新的key
bool hashAddItem(HashItem **obj, const char* key) {
    if (hashFindItem(obj, key)) {  // 如果已经存在,返回false
        return false;
    }
    HashItem *pEntry = (HashItem *)malloc(sizeof(HashItem));  // 分配内存
    sprintf(pEntry->key, "%s", key);  // 将key复制到哈希表项中
    HASH_ADD_STR(*obj, key, pEntry);  // 向哈希表中添加key
    return true;
}

// 释放哈希表
void hashFree(HashItem **obj) {
    HashItem *curr = NULL, *tmp = NULL;
    HASH_ITER(hh, *obj, curr, tmp) {  // 迭代哈希表中的所有项
        HASH_DEL(*obj, curr);  // 删除当前项
        free(curr);  // 释放内存
    }
}

// 计算两个哈希表的交集大小
size_t get_intersect_size(const HashItem *a, const HashItem *b) {
    size_t ans = 0;
    for (HashItem *pEntry = a; pEntry; pEntry = pEntry->hh.next) {  // 遍历哈希表a
        if (hashFindItem(&b, pEntry->key)) {  // 如果b中也有相同的key
            ++ans;  // 交集大小加1
        }
    }
    return ans;
}

// 计算不同的名字组合数
long long distinctNames(char** ideas, int ideasSize) {
    HashItem *names[26] = {NULL};  // 存放26个字母对应的哈希表
    for (int i = 0; i < ideasSize; i++) {
        hashAddItem(&names[ideas[i][0] - 'a'], ideas[i] + 1);  // 根据首字母添加到对应哈希表
    }

    long long ans = 0;
    for (int i = 0; i < 26; i++) {
        if (names[i] == NULL) {  // 如果当前字母组为空,跳过
            continue;
        }
        int lenA = HASH_COUNT(names[i]);  // 获取当前组的字符串数量
        for (int j = i + 1; j < 26; j++) {
            if (names[j] == NULL) {  // 如果对比的字母组为空,跳过
                continue;
            }
            int lenB = HASH_COUNT(names[j]);  // 获取对比组的字符串数量
            int intersect = get_intersect_size(names[i], names[j]);  // 计算两个组的交集
            ans += 2 * (lenA - intersect) * (lenB - intersect);  // 计算合法的字符串对数
        }
    }
    for (int i = 0; i < 26; i++) {
        hashFree(&names[i]);  // 释放哈希表
    }
    return ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2176806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选购适合自己的内衣洗衣机?五款热门卓越型号测评推荐

相信不少小伙伴都跟我一样&#xff0c;一方面&#xff0c;认为内裤、袜子与大件的上衣、裤子放一块清洗&#xff0c;会感觉很不卫生&#xff0c;而且穿在身上也不安心。但是另一方面&#xff0c;本身又很懒惰&#xff0c;也不想自己用手洗&#xff0c;不但经常会遗漏一些污渍&a…

探索 DaPy:Python 中的 AI 数据处理新贵

文章目录 探索 DaPy&#xff1a;Python 中的 AI 数据处理新贵背景介绍DaPy 是什么&#xff1f;如何安装 DaPy&#xff1f;DaPy 的简单函数使用方法加载数据数据筛选数据聚合数据可视化自定义函数 DaPy 在实际场景中的应用数据预处理数据分析数据处理与集成 常见 Bug 及解决方案…

蓝牙资讯|2024可穿戴市场的手表将出现下滑,耳机和戒指将增长

市场调查机构 IDC 发布博文&#xff0c;预测 2024 年全球可穿戴设备出货量达到 5.379 亿台&#xff0c;同比增长 6.1%。IDC 预计新兴市场的进一步普及和成熟市场的更新周期的开始将推动听力设备的发展&#xff0c;因为消费者希望更换大流行病时期购买的产品。 IDC 预估 2024 …

VS2017安装Installer Projects制作Setup包

下载安装扩展包 VS2017默认未安装Installer Projects Package&#xff0c;需要联机下载&#xff1a; 也可网页上下载离线InstallerProjects.vsix文件&#xff1a; https://visualstudioclient.gallerycdn.vsassets.io/extensions/visualstudioclient/microsoftvisualstudio20…

Spring Boot 进阶-Spring Boot 如何实现自定义的过滤器详解

在上一篇文章中我们讲解了关于拦截器的相关内容,并且通过一个防抖的例子来讲解了拦截器在实际开发中的使用。这篇文章我们为大家带来的就是关于过滤器的相关内容的分享。下面我们首先来介绍一下什么是过滤器。 什么是过滤器? 过滤器Filter,是Servlet技术中最常用的技术,开…

K8S精进之路-控制器DaemonSet -(3)

介绍 DaemonSet就是让一个节点上只能运行一个Daemonset Pod应用&#xff0c;每个节点就只有一个。比如最常用的网络组件&#xff0c;存储插件&#xff0c;日志插件&#xff0c;监控插件就是这种类型的pod.如果集群中有新的节点加入&#xff0c;DaemonSet也会在新的节点创建出来…

【Router】路由功能之DMZ(Demilitarized Zone)功能介绍及实现

DMZ&#xff08;Demilitarized Zone&#xff09; DMZ&#xff08;非军事化区域&#xff09;是一个位于内部网络和外部网络之间的分段区域。在一个网络中&#xff0c;DMZ通常包含运行公共服务的服务器或其他设备。 DMZ是一个位于内部网络和外部网络之间的分段区域&#xff0c;用…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…

【笔记】Java 栈 java.util.Stack

目标:了解Java编程语言里栈和队列是什么样的。 概念 在Java中,Stack 类表示一个后进先出(LIFO,Last-In-First-Out)的对象栈。它继承自 Vector 类,并提供了五个操作,允许将向量(Vector)视为栈来处理。这些操作包括常用的: 压栈(push)出栈(pop)操作用于查看栈顶元…

物理加密机的高性能操作

物理加密机&#xff0c;也被称为硬件安全模块(HSM)或加密锁&#xff0c;是一种用于保护敏感数据和软件应用的物理设备。以下是关于物理加密机的详细介绍&#xff1a; 一、定义与功能 物理加密机通过提供强大的加密功能和访问控制&#xff0c;确保数据在存储、处理和传输过程中的…

GIS--为研究区准备数据

一、实验目的 掌握空间数据的分幅组织方法&#xff0c;掌握常用的空间数据处理技术 二、实验内容 计算图幅号&#xff1b;空间配准、投影定义、投影转换&#xff1b;拼接、裁切&#xff0c;获取研究区内的土地利用数据 三、实验原理与方法 实验原理&#xff1a;空间数据组…

【火狐浏览器 - 数据同步】使用Mozilla账户登录

不要使用火狐通行证 解决方法 在国内下载 开发版本的firefox, 即可数据同步 https://www.mozilla.org/zh-CN/firefox/all/ 登录成功 其他 如果还不同步, 试下这个插件 http://mozilla.com.cn/thread-343905-1-1.html

可控硅光耦——工业自动化智能转型的护航先锋

随着工业自动化程度的持续深化&#xff0c;对安全性、可靠性和智能化水平的要求愈发严苛。在这一浪潮中&#xff0c;可控硅光耦凭借其卓越性能&#xff0c;正逐渐成为工业自动化领域的核心驱动力。本文将深入探讨可控硅光耦在工业自动化智能转型中的创新应用与价值。 提升生产…

四气两尘监测站中空气质量传感器推荐

在快速发展的工业化进程中&#xff0c;空气质量已成为衡量一个地区环境健康水平的重要指标。随着公众环保意识的增强&#xff0c;对空气质量的关注不再局限于直观的蓝天白云&#xff0c;而是深入到更为细微、复杂的污染物层面&#xff0c;其中&#xff0c;“四气两尘”便是这一…

C++第五讲(1):STL--string--各个函数的使用方法

C第五讲&#xff1a;STL--string 1.STL简介2.string类2.1string类的常见构造2.1.1重点1&#xff1a; string&#xff08;&#xff09;2.1.2重点2&#xff1a;string(const string& str)2.1.3使用3&#xff1a;string(const string& str, size_t pos, size_t len npos)…

CSS实现磨砂玻璃效果

引言 最近看到有一种磨砂玻璃背景效果很好看&#xff0c;自己简单制作了一个美杜莎女王小卡片&#xff0c;效果如下&#xff1a; backdrop-filter: blur(10px); 通过设置背景幕布的模糊程度&#xff0c;结合背景图片&#xff0c;实现磨砂玻璃效果 案例代码 <!DOCTYPE h…

探索Kimi:为程序员打造的智能助手

程序员的生活充满了挑战和创新。他们需要快速获取信息、解决问题并保持技术的前沿。在这个快节奏的环境中&#xff0c;一个可靠的智能助手可以成为他们最宝贵的资源之一。今天&#xff0c;我想向你们介绍Kimi——一个由月之暗面科技有限公司开发的人工智能助手&#xff0c;它专…

都选这条赛道,万粉博是不是要烂大街了...

最近参加了一个有意思的项目&#xff1a;视频号数字人直播带货&#xff0c;就是批量起矩阵号发布视频&#xff0c;视频内容呢都是卖各种东西&#xff0c;比如足球灯、除螨喷雾、果蔬净等等。 这是一个比较有潜力的项目&#xff0c;到后面再给大家具体介绍吧。那今天给大家介绍的…

springboot整合sentinel和对feign熔断降级

一、准备 docker安装好sentinel-dashboard&#xff08;sentinel控制台&#xff09;&#xff0c;参考docker安装好各个组件的命令启动sentinel-dashboard&#xff0c;我的虚拟机ip为192.168.200.131&#xff0c;sentinel-dashboard的端口为8858 二、整合sentinel的主要工作 在…

LeetCode讲解篇之53. 最大子数组和

文章目录 题目描述题解思路题解代码 题目描述 题解思路 该问题我们可以转换为求以i为最后一个元素的0 ~ i范围内的最大子数组和&#xff0c;然后其中的所有的最大子数组和的最大值就是我们要返回的答案 题解代码 func maxSubArray(nums []int) int {ans : nums[0]for i : 1;…