【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算

简介: 【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算

最大单词长度乘积【LC318】

给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j])最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0

2022/10/17

位运算

将每个单词转化为整数(二进制形式),用最低位代表a,第二低位代表b……最高位(第二十六位)代表z,例如单词“ab”可表示为11,十进制为3

将某个单词的二进制形式与其他单词进行与运算,如果结果为0,那么代表这两个单词不含有公共字母,判断是否需要更新结果

代码

class Solution {
    public int maxProduct(String[] words) {
        int len = words.length;
        int[] binary = new int[len]; // a:1 b:2 c:4 ……
        for (int i = 0; i < len; i++){
            String str = words[i];
            boolean[] map = new boolean[26];
            for (int j = 0; j < str.length(); j++){
                int n = str.charAt(j)-'a';
                if (!map[n]){
                    binary[i] += Math.pow(2,n);
                    map[n] = true;
                }
            }
        }
        int res = 0;
        for (int i = 0; i < len; i++){
            for (int j = i + 1; j < len; j++){
                if ((binary[i] & binary[j]) == 0){
                    res = Math.max(res,words[i].length()*words[j].length());
                }
            }
        }    
        return res;    
    }
}
  • 复杂度
  • 时间复杂度:O(n2+nk),n为字符串的个数,k为每个字符串的平均长度
  • 空间复杂度:O(n)
  • 优化

将每个字符串转化为二进制的代码可优化为

for (int i = 0; i < len; i++){
     String str = words[i];
     for (char ch: words[i].toCharArray()){
        binary[i] |= 1 << (ch - 'a'); 
    }
}

代码

class Solution {
    public int maxProduct(String[] words) {
        int len = words.length;
        boolean[][] flags = new boolean[len][26]; 
        for (int i = 0; i < len; i++){
            String str = words[i];
            for (char ch: words[i].toCharArray()){
                flags[i][ch-'a'] = true;
            }
        }
        int res = 0;
        for (int i = 0; i < len; i++){
            for (int j = i + 1; j < len; j++){
                int k = 0;
                for (; k < 26; k++){
                    if (flags[i][k] && flags[j][k]){
                        break;
                    }
                }
                if (k == 26){
                    res = Math.max(res,words[i].length()*words[j].length());
                }
            }
        }    
        return res;    
    }
}
  • 复杂度
  • 时间复杂度:O(n2+nk),n为字符串的个数,k为每个字符串的平均长度
  • 空间复杂度:O(n)
目录
相关文章
|
SQL 安全
初探POC编写
初探POC编写
475 0
初探POC编写
|
存储 运维 Kubernetes
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
|
Shell
Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
【2月更文挑战第17天】Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
557 2
|
11月前
|
数据采集 机器学习/深度学习 存储
大数据的处理流程
【10月更文挑战第16天】
927 2
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能的边界拓展:从理论到实践的飞跃####
本文探讨了人工智能(AI)技术的最新进展,特别是深度学习领域的创新如何推动AI从理论研究走向广泛应用。通过分析几个关键领域的实际应用案例,如医疗健康、自动驾驶和自然语言处理,本文揭示了AI技术的潜力及其对社会和经济的深远影响。文章还讨论了当前面临的挑战,包括伦理问题和技术瓶颈,并展望了未来的发展趋势。 ####
|
前端开发 数据安全/隐私保护
JS-RSA超长加密
JS-RSA超长加密
303 62
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在医疗健康领域的最新进展
人工智能在医疗健康领域的最新进展
|
Java Android开发 开发者
17. 【Android教程】开关控件ToggleButton/Switch
17. 【Android教程】开关控件ToggleButton/Switch
391 2
|
机器学习/深度学习 算法 机器人
【博士每天一篇文献-算法】改进的PNN架构Lifelong learning with dynamically expandable networks
本文介绍了一种名为Dynamically Expandable Network(DEN)的深度神经网络架构,它能够在学习新任务的同时保持对旧任务的记忆,并通过动态扩展网络容量和选择性重训练机制,有效防止语义漂移,实现终身学习。
208 9
|
11月前
|
自然语言处理 搜索推荐 程序员
【Python】如何使用pip,安装第三方库和生成二维码、操作Excel
【Python】如何使用pip,安装第三方库和生成二维码、操作Excel
229 0