0哈希困难 LeetCode6094. 公司命名

6094. 公司命名

描述

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

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

分析

暴力遍历每一对字符串O(n^2)会超时.
替换字符串得首字母,判断在ideas中是否已经出现。
建立一个首字母对首字母的26*26大小二维数组。
单边计算把字符串得首字母替换成任意一个字母,然后再到ideas中判断时候已经出现过,没有出现则这个新字符串是有效得,有效记录加一。所有得字符串都做这样处理。
遍历二维数组,ch[i][j] * ch[j][i],如果一个字符串的首字母替换之后在Ideas中不存在,替换首字母的字符在ideas的字符串中不存在,则ch[i][j] * ch[j][i]的结果是0,因此不会凭空多出结果。

class Solution {
    public long distinctNames(String[] ideas) {
        Set<String> set = new HashSet<>();
        for (String str : ideas) {
            set.add(str);
        }
        int[][] ch = new int[26][26];
        for (String str : ideas) {
            int index = str.charAt(0) - 'a';
            for (int i = 0; i < 26; i++) {
                String s = (char)('a'+i) + str.substring(1);
                if (!set.contains(s)) {
                    ch[index][i]++;
                }
            }
        }
        long ans = 0;
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < 26; j++) {
                ans += ch[i][j] * ch[j][i];
            }
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值