字母异位词分组算法题

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

解题思路:由于字母异位词中每个字母出现的次数是一定的,只是顺序不同,所以很容易想到的思路是创建一个哈希表,哈希表的键是异位词生成的键,如eatt,teta,ttea这三个异位词就可以生成一个a1e1t2的键,然后哈希表的值是一个字符串列表,用来放键相同的异位词,遍历完所有字符串之和就可以将哈希表的值输出出来。

​
class Solution { 
public List<List<String>> groupAnagrams(String[] strs)
 { Map<String, List<String>> map = new HashMap<String, List<String>>(); 
for (String str : strs)
 { int[] counts = new int[26];
 int length = str.length(); 
for (int i = 0; i < length; i++) 
{ counts[str.charAt(i) - 'a']++; } 
// 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
 StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < 26; i++)
 { if (counts[i] != 0)
 { sb.append((char) ('a' + i));
 sb.append(counts[i]); } } 
String key = sb.toString(); 
List<String> list = map.getOrDefault(key, new ArrayList<String>());
 list.add(str); 
map.put(key, list); } 
return new ArrayList<List<String>>(map.values()); } }

​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值