leetcode第49题

简介: 时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。空间复杂度:O(NK),用来存储结果。解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。

image.png

给定多个字符串,然后把它们分类。只要字符串所包含的字符完全一样就算作一类,不考虑顺序。

解法一

最通用的一种解法,对于每个字符串,比较它们的每个字符出现的个数是否相等,相等的话就把它们放在一个 list 中去,作为一个类别。最外层写一个 for 循环然后一一比较就可以,还可以用一个等大的布尔型数组来记录当前字符串是否已经加入的了 list 。比较两个字符串的字符出现的次数可以用一个 HashMap,具体看代码吧。

publicList<List<String>>groupAnagrams(String[] strs) {
List<List<String>>ans=newArrayList<>();
boolean[] used=newboolean[strs.length];
for (inti=0; i<strs.length; i++) {
List<String>temp=null;
if (!used[i]) {
temp=newArrayList<String>();
temp.add(strs[i]);
//两两比较判断字符串是否符合for (intj=i+1; j<strs.length; j++) {
if (equals(strs[i], strs[j])) {
used[j] =true;
temp.add(strs[j]);
                }
            }
        }
if (temp!=null) {
ans.add(temp);
        }
    }
returnans;
}
privatebooleanequals(Stringstring1, Stringstring2) {
Map<Character, Integer>hash=newHashMap<>();
//记录第一个字符串每个字符出现的次数,进行累加for (inti=0; i<string1.length(); i++) {
if (hash.containsKey(string1.charAt(i))) {
hash.put(string1.charAt(i), hash.get(string1.charAt(i)) +1);
        } else {
hash.put(string1.charAt(i), 1);
        }
    }
//记录第一个字符串每个字符出现的次数,将之前的每次减 1for (inti=0; i<string2.length(); i++) {
if (hash.containsKey(string2.charAt(i))) {
hash.put(string2.charAt(i), hash.get(string2.charAt(i)) -1);
        } else {
returnfalse;
        }
    }
//判断每个字符的次数是不是 0 ,不是的话直接返回 falseSet<Character>set=hash.keySet();
for (charc : set) {
if (hash.get(c) !=0) {
returnfalse;
        }
    }
returntrue;
}

时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。

空间复杂度:O(NK),用来存储结果。

解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。

下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。


image.png

利用 HashMap 去记录字符的次数之前也有遇到过,很常用。利用质数相乘,是真的太强了。

相关文章
|
缓存 监控 网络协议
【华为HCIP | 职业认证考试】821每日一刷
【华为HCIP | 职业认证考试】821每日一刷
2014 0
【华为HCIP | 职业认证考试】821每日一刷
|
前端开发 Java Maven
Springboot创建项目(idea版本)
Springboot创建项目(idea版本)
582 0
Windows 10 控制台cmd中文显示乱码的解决方案
Windows 10 控制台cmd中文显示乱码的解决方案
Windows 10 控制台cmd中文显示乱码的解决方案
|
安全 Java API
阿里云——Java实现手机短信验证码功能
通过手机短信发送验证码,是最普遍、最安全验证用户真实身份的方式。目前,短信验证码广泛应用于用户注册、密码找回、登录保护、身份认证、随机密码、交易确认等应用场景。本文通过调用API开发一个短信验证码为例,带您了解如何实现短信验证码功能。
9179 7
阿里云——Java实现手机短信验证码功能
|
Java 网络安全 Nacos
nacos注册不上刷这个错,有解决方案吗?
【2月更文挑战第30天】nacos注册不上刷这个错,有解决方案吗? springboot项目,瘦身打包后,用java -jar 外置依赖和外置配置文件启动的时候,nacos注册不上刷这个错,有解决方案吗? com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING
1230 1
|
前端开发 JavaScript UED
处理 React 运行时中的错误和异常
【10月更文挑战第25天】在React运行时中,有效地处理错误和异常对于确保应用的稳定性和用户体验至关重要。
|
存储 机器学习/深度学习 物联网
基于重要性加权的LLM自我改进:考虑分布偏移的新框架
本文提出一种新的大型语言模型(LLM)自我改进框架——基于重要性加权的自我改进(IWSI),旨在优化自动生成数据的质量。通过引入DS权重指标衡量数据的分布偏移程度(DSE),该方法不仅能确保答案正确性,还能过滤掉那些虽正确但分布上偏离较大的样本,以提升自我训练的效果。IWSI使用一个小的有效数据集来估算每个自生成样本的DS权重,并据此进行筛选。实验结果显示,相比于仅依赖答案正确性的传统方法,IWSI能更有效地提高LLM在多种任务上的表现。特别是在数学问题解答任务上,相较于基线方法,IWSI带来了显著的性能提升,证实了过滤高DSE样本的重要性及该方法的有效性。
342 0
基于重要性加权的LLM自我改进:考虑分布偏移的新框架
|
API 网络架构 Python
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
225 0
|
设计模式 Java
Java设计模式之责任链模式详解
Java设计模式之责任链模式详解
|
JavaScript 前端开发
js实现对象数组去重(背,新人友好)
js实现对象数组去重(背,新人友好)
168 0