【leetcode刷题笔记】Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
题解:
所谓的anagrams,只若干个词,它们包含的字母的个数和种类完全一样,只是字符的顺序不一样。比如说bus,usb,sub就是一组angrams。同一组angrams具有排序后相同的特点,比如对上述三个单词按字典序排序分别得到bsu,bsu,bsu。我们用这一点判断两个单词是否是一组angrams。
题目给出一个String数组,要求找出其中所有angrams组,并把它们放在同一个list中返回。
比如给定输入[usb,tea,eat,that,bus,sub,and],应该返回输入[usb,bus,sub,tea,eat]。
利用map解这道题,其中key是单词按照字典序排序后得到的单词,value是排序后为key的单词在strs中索引。比如上述的例子里对应的map如下表所示:
key | value |
bsu | 0,4,5 |
aet | 1,2 |
ahtt | 3 |
adn | 6 |
然后遍历map,把value对应的list长度大于1的list对应的元素放入answer list中即可。
代码如下:
1 public class Solution { 2 public List<String> anagrams(String[] strs) { 3 HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>(); 4 for(int i = 0;i < strs.length;i++){ 5 String s = strs[i]; 6 char[] chars = s.toCharArray(); 7 Arrays.sort(chars); 8 String key = new String(chars); 9 if(map.containsKey(key)) 10 { 11 ArrayList<Integer> value = map.get(key); 12 value.add(i); 13 map.put(key, value); 14 } 15 else{ 16 ArrayList<Integer> strings = new ArrayList<Integer>(); 17 strings.add(i); 18 map.put(key, strings); 19 } 20 } 21 22 List<String> answer = new ArrayList<String>(); 23 24 for(Map.Entry<String, ArrayList<Integer>> entry:map.entrySet()){ 25 ArrayList<Integer> temp = entry.getValue(); 26 if(temp.size() > 1){ 27 for(int i = 0;i < temp.size();i++) 28 answer.add(strs[temp.get(i)]); 29 } 30 } 31 32 return answer; 33 } 34 }
分类:
leetcode刷题总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了