前言
每天和你一起刷 LeetCode 每日一题~
LeetCode 启动!
题目:公司命名
代码与解题思路
func distinctNames(ideas []string) (ans int64) {
// ideas = ["coffee","donuts","time","toffee"]
// 根据首字母分组
// c offee
// d onuts
// t ime、offee
// 首字母 d 和 c 之间有 1*1 组,t 和 c 之间有 0*1 组,t 和 d 之间有 1*2 组
// 总共 (1*1 + 0*1 + 1*2) * 2 = 6 组
// 根据首字母分组
g := [26]map[string]int{}
for i := range g {
g[i] = map[string]int{}
}
for _, s := range ideas {
g[s[0]-'a'][s[1:]] = 1
}
// 枚举所有组
for i, a := range g {
for _, b := range g[:i] {
m := 0 // 相同后续的个数(比如示例一中的 offee)
for s := range a { // 枚举该首字母的集合
if b[s] == 1 { // 两个集合对比查看是否有相同的后续
m++
}
}
ans += int64(len(a)-m) * int64(len(b)-m) // 乘法原理计数
}
}
return ans * 2 // 前后顺序,最后需要 * 2
}
今天这道题比较难
我这个解法的核心思路是:“根据首字母进行分组”,只要想到这个思路,后续就能通过枚举所有的组合来计算所有可能存在的方案了
延续上面的思路,如注释,模拟题目的示例一,尝试用乘法原理快速计算组合之间有多少种可能存在的方案,思考出计算的公式,这道题就能做出来了。
字符串类型的题目最重要的地方在于多积累,除了一些用模版定式的算法,其他类型的题目大多都需要大量的积累,当下次遇到类似的题目,我大脑 dfs 解决方案的时候就会遍历到这个思路。
视频实况
【【LeetCode】每日一题 2024_9_25 公司命名(字符串、乘法原理)】