您的位置:首页 > 编程语言 > Java开发

Leet Code 49 Group Anagrams - 变形词分组 - Java

2016-06-23 00:00 176 查看
摘要: Leet Code 49 Group Anagrams - 变形词分组 - Java

问题原始链接 https://leetcode.com/problems/anagrams

给定一个字符串数组,按变形词分组。

例如,给定 ["eat", "tea", "tan", "ate", "nat", "bat"],返回:

[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]

注意:所有输入都是小写。

思路:扫描每个字符串,统计每个小写字母出现次数,然后以字母及其次数生成分组标识符,如果两个字符串的分组标识符相同,那么它们就属于同一分组。例如,字符串"eat",字母'e'1个,字母'a'1个,字母't'1个,生成分组标识符"a1e1t1",字符串"ate"生成的分组标识符也是"a1e1t1",所以字符串"eat"和"ate"属于同一分组。

[code=language-java]public class Solution {
public static List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
if (strs == null || strs.length == 0) {
return result;
}
int[] counter = new int[26];
Map<String, List<String>> groupToStrs = new HashMap<String, List<String>>();
StringBuilder groupIdGenerator = new StringBuilder();
for (String s : strs) {
count(s, counter);
String groupId = genGroupId(counter, groupIdGenerator);
List<String> list = groupToStrs.get(groupId);
if (list == null) {
list = new ArrayList<String>();
groupToStrs.put(groupId, list);
}
list.add(s);
}
result.addAll(groupToStrs.values());
return result;
}

private static void count(String s, int[] counter) {
Arrays.fill(counter, 0);
for (int i = 0; i < s.length(); i++) {
counter[s.charAt(i) - 'a']++;
}
}

private static String genGroupId(int[] counter, StringBuilder groupIdGenerator) {
groupIdGenerator.setLength(0);
for (int i = 0; i < counter.length; i++) {
if (counter[i] > 0) {
groupIdGenerator.append((char) ('a' + i));
groupIdGenerator.append(counter[i] + "");
}
}
return groupIdGenerator.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息