今天给大家带来一道java经典题目 异位词分组
二、示例
2.1> 示例 1:
【 输入】 strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
【 输出】 [["bat"],["nat","tan"],["ate","eat","tea"]]
2.2> 示例 2:
【 输入】 strs = [""]
【 输出】 [[""]]
2.3> 示例 3:
【 输入】 strs = ["a"]
【 输出】 [["a"]]
题目如上
思路
其实看到这个问题我第一次做脑海里面会有很多疑惑
比如 什么是异位词 怎么判断两个词是不是异位词等等
接下来 贴上详细解释
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
明显看到 异位词 关键 字母相同 出现次数相同
知道这点我们就可以去着手实现了
思路:
这道题目要求你将给定的字符串数组分组,每组包含的都是字母异位词。所谓“字母异位词”是指在单词的字母重新排列之后可以得到另外一个单词。也就是说,如果两个单词有着相同的字母且每个字母出现的次数也相同,那么这两个单词就互为字母异位词。
这里不需要遍历每一个字母的所有可能组合,也不需要判断单词是否合法,因为题目已经提供了所有的单词,你只需要将它们分组。
对于示例 1,"eat", "tea", "ate"互为异位词,因为它们都包含相同的字母'e', 'a', 't'。同理,"tan"和"nat"是一组,因为它们都包含't', 'a', 'n'。而"bat"没有异位词,所以它单独成为一组。
这样的题目通常可以通过排序字符串中的字符来解决。对于每个单词,将它的字母按照字典顺序排序,然后所有排序后相同的单词就归为一组。这样,所有异位词都会拥有相同的排序字符串,这可以作为一个键值存储在哈希表中。
下面是一个解决这个问题的简单算法步骤:
- 创建一个哈希表,用来存储每一个排序后的单词和对应的字符串数组。
- 遍历给定的字符串数组,对于每一个字符串,将其按字母排序。
- 将排序后的字符串作为键,原始字符串作为值,存储到哈希表中。
- 最后,哈希表中的每个值就是一组异位词。
这里提供java 题解
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>>map=new HashMap();
for(String str:strs)
{
char [] sc=str.toCharArray();
Arrays.sort(sc);
String key=new String(sc);
if(map.get(key)==null)
{
List list=new ArrayList();
list.add(str);
map.put(key,list);
}
//如果已经存在相同key 元素 即在后面追加
else
map.get(key).add(str);
}
return new ArrayList(map.values());
}
}
结果
至此完结撒花 大家共勉