当前位置:网站首页>golang刷letcode:公司命名
golang刷letcode:公司命名
2022-08-02 20:37:00 【用户9710217】
给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下:
从 ideas 中选择 2 个 不同 名字,称为 ideaA 和 ideaB 。
交换 ideaA 和 ideaB 的首字母。
如果得到的两个新名字 都 不在 ideas 中,那么 ideaA ideaB(串联 ideaA 和 ideaB ,中间用一个空格分隔)是一个有效的公司名字。
否则,不是一个有效的名字。
返回 不同 且有效的公司名字的数目。
示例 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 。
提示:
2 <= ideas.length <= 5 * 104
1 <= ideas[i].length <= 10
ideas[i] 由小写英文字母组成
ideas 中的所有字符串 互不相同
解题思路:
1,首先可以将字符串拆分成两部分:首字母和剩余部分
2,按照剩余部分分组:同一个分组内部的首字母呼唤,必然重复
3,分组间首字母交换,比如groupi和groupj交换,如果groupj中的首字母在groupi中出现过,那么必然重复
4,所以最终结果应该是groupi和groupj中去除公共部分的首字母相互交换。
5,如果按照这个思路实现的话需要求groupi和groupj的组合情况,复杂度是O(n^ 2)会超时
6,反过来想,groupi和groupj可以枚举的值都是26个即26^2,我们需要的就是有i无j和无i有j的个数
7,最终只需在一次遍历中统计无i️j的group的个数,cnt[i][j];因为有i无j可以从cnt[j][i]取得
8,在一次遍历中假如在位置i,如果groupi中包含字母a,对于已经遍历过得所有不含a的group的个数就是我们需要的可交换次数
9,由于我们交换后的两个字符串可以互换位置,因此结果需要*2
func distinctNames(ideas []string) (ans int64) {
group := map[string]int{}
for _, s := range ideas {
group[s[1:]] |= 1 << (s[0] - 'a')
}
cnt := [26][26]int{}
for _, mask := range group {
for i := 0; i < 26; i++ {
if mask>>i&1 == 0 {
for j := 0; j < 26; j++ {
if mask>>j&1 > 0 {
cnt[i][j]++
}
}
} else {
for j := 0; j < 26; j++ {
if mask>>j&1 == 0 {
ans += int64(cnt[i][j])
}
}
}
}
}
return ans * 2
}
边栏推荐
- Bee 事务注解 @Tran 使用实例
- 信息学奥赛一本通(1259:【例9.3】求最长不下降序列)
- Informatics Olympiad All-in-One (1259: [Example 9.3] Find the longest non-descending sequence)
- 网上那么多教人赚钱的方法,但是你实际上是靠什么赚钱的呢?
- 信息学奥赛一本通(1256:献给阿尔吉侬的花束)
- Li Mu hands-on learning deep learning V2-bert and code implementation
- 【目标检测】YOLOv5:640与1280分辨率效果对比
- VisualStudio 制作Dynamic Link Library动态链接库文件
- 【流媒体】推流与拉流简介
- ICLR 2022最佳论文:基于对比消歧的偏标签学习
猜你喜欢
用户之声 | 我与GBase的缘分
包管理工具npm- node package management相关知识 、检查包更新、NPM包上传、更换镜像、npm ERR! registry error parsing json
Flink Yarn Per Job - 启动AM
广东省数字经济发展指引 1.0之建成数据安全保障体系
【3D视觉】深度摄像头与3D重建
李沐动手学深度学习V2-BERT预训练和代码实现
Digital twins help visualize the construction of smart cities
DataGrip 安装教程 详细版
Helm基础知识
软件测试的流程规范有哪些?具体要怎么做?
随机推荐
Which thread pool does Async use?
PyRosetta 安装方法之Conda安装
vscode如何能将输出从OUTPUT改为TERMINAL或者DebugConsole
网上那么多教人赚钱的方法,但是你实际上是靠什么赚钱的呢?
接口测试常用工具及测试方法(入门篇)
Golang source code analysis: time/rate
解道9-编程技术6
供电系统电气图
李沐动手学深度学习V2-BERT预训练和代码实现
【目标检测】YOLOv5:640与1280分辨率效果对比
Nervegrowold hands-on learning deep learning V2 - Bert pre training data set and code implementation
信息学奥赛一本通(1257:Knight Moves)
封装和包、访问修饰权限
[C题目]力扣1. 两数之和
你是几星测试/开发程序员?技术型选手王大拿......
"Weekly Translate Go" This time we have something different!-- "How to Code in Go" series launched
解道6-编程技术3
训练双塔检索模型,可以不用query-doc样本了?明星机构联合发文
信息系统项目管理师必背核心考点(五十八)变更管理的主要角色
【3D视觉】深度摄像头与3D重建