枚举+组合数学,LeetCode 2306. 公司命名

devtools/2024/9/29 19:36:54/

目录

一、题目

1、题目描述

2、接口描述

python3

cpp

C#

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解

python3

cpp

C#


一、题目

1、题目描述

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

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

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

2、接口描述

python3
 ​
    def distinctNames(self, ideas: List[str]) -> int:
cpp
 ​
class Solution {
public:long long distinctNames(vector<string>& ideas) {}
};
C#
 ​
public class Solution
{public long DistinctNames(string[] ideas){}
}

3、原题链接

2306. 公司命名


二、解题报告

1、思路分析

考虑每个首字符出现次数 cnt[]

答案是 cnt[i] * cnt[j] 其中 j < i 吗?

会有非法的

非法的满足什么?

对于不同的i, j,却有着相同的 s[1::]

我们可以将字符串按照后缀分组,遍历字符串数组,计算每个后缀的重叠 pair(i, j) 数目即可

2、复杂度

时间复杂度: O(n(m + U))空间复杂度:O(U^2 + nm)

3、代码详解

python3
 ​
class Solution:def distinctNames(self, ideas: list[str]) -> int:cnt = [0] * 26g = [[0] * 26 for _ in range(26)]adj = defaultdict(list)for s in ideas:a = ord(s[0]) - ord('a')st = adj[s[1::]]for b in st:g[a][b] += 1g[b][a] += 1st.append(a)cnt[a] += 1res = 0for a in range(1, 26):for b in range(a):m = g[a][b]res += (cnt[a] - m) * (cnt[b] - m)return res * 2
cpp
 ​
class Solution {
public:long long distinctNames(vector<string>& ideas) {std::unordered_map<std::string, std::vector<int>> mp;std::array<int, 26> cnt{};std::vector<std::array<int, 26>> g(26, std::array<int, 26>{});for (auto &s : ideas) {auto &st = mp[s.substr(1)];int a = s[0] - 'a';for (int b : st)++ g[a][b], ++ g[b][a];st.push_back(a);++ cnt[a];}long long res = 0;for (int a = 1; a < 26; ++ a)for (int b = 0; b < a; ++ b) {int m = g[a][b];res += 1LL * (cnt[a] - m) * (cnt[b] - m);}return res * 2;}
};
C#
 ​
public class Solution
{public long DistinctNames(string[] ideas){IDictionary<string, List<int>> mp = new Dictionary<string, List<int>>();int[] cnt = new int[26];int[,] g = new int[26, 26];foreach (string s in ideas){var sb = s.Substring(1);if (!mp.ContainsKey(sb))mp.Add(sb, new List<int>());List<int> st = mp[sb];int a = s[0] - 'a';foreach(int b in st){++g[a, b];++g[b, a];}++cnt[a];st.Add(a);}long res = 0;for(int a = 1; a < 26; ++ a)for(int b = 0; b < a; ++ b){int m = g[a, b];res += 1L * (cnt[a] - m) * (cnt[b] - m);}return res * 2;}
}


http://www.ppmy.cn/devtools/118850.html

相关文章

用Swift实现验证回文字符串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…

docker-图形化工具-portainer的使用

文章目录 1、安装和启动2、设置登陆密码3、dashboard 上述对容器和镜像的管理都是基于docker客户端的命令来完成&#xff0c;不太方便。为了方便的对docker中的一些对象(镜像、容器、数据卷…)来进行管理&#xff0c;可以使用Portainer来完成。Portainer是一个可视化的容器镜像…

Trapezoidal Decomposition梯形分解算法(TCD)

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言Trapezoidal Decomposition梯形分解算法&#xff08;TCD&#xff09;原理&#xff08;1&#xff09;第一种原理&#xff08;2…

18.Linux-配置DNF仓库

DNF仓库产生背景 在现实的场景中&#xff0c;我们经常要安装一些软件包&#xff0c;但由于现场不提供网络。 需要使用光盘或文件下载的方式去安装。 对于linux有两种离线安装方式&#xff1a;二进制文件安装和源码安装 其中二进制文件是比较简单的安装方式&#xff0c;不同的l…

sqli-labs:1~16(sql注入点稳定判断语句、全回显半回显报错回显无回显利用思路、sql注入tips)

怎么验证sql注入的存在呢&#xff1f; 首先&#xff0c;双引号单引号注入&#xff0c;看看有没有报错&#xff0c;或者与正常参数的区别&#xff0c;有报错说明大概率可以注入成功&#xff0c;但是&#xff0c;很可能单引号和双引号测试可能没有报错回显&#xff0c;或者与正常…

android system_server进程

android system_server进程 system_server进程是系统进程&#xff0c;java framework框架的核心载体&#xff0c;里面运行了大量的系统服务&#xff0c;比如这里提供ApplicationThreadProxy&#xff08;简称ATP&#xff09;&#xff0c;ActivityManagerService&#xff08;简称…

【观察】华为:构筑先进AI存力底座,引领时代更创造时代

知名科技杂志《连线》创始主编凯文凯利曾预测&#xff1a;“在未来的 100 年里&#xff0c;人工智能将超越任何一种人工力量&#xff0c;将人类引领到一个前所未有的时代。” 确实如此&#xff0c;犹如历史上蒸汽机、电力、计算机和互联网等通用技术一样&#xff0c;近20年来&a…

Hbase要点简记

Hbase要点简记 Hbase1、底层架构2、表逻辑结构 Hbase HBase是一个分布式的、列式的、实时查询的、非关系型数据库&#xff0c;可以处理PB级别的数据&#xff0c;吞吐量可以到的百万查询/每秒。主要应用于接口等实时数据应用需求&#xff0c;针对具体需求&#xff0c;设计高效率…