Leetcode49. 字母异位词分组
题目:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
题解:
方案一:将每个字符串进行排序,新建一个map,排序好的字符串作为key,和key相同的原字符串作为value同时存入map中,最后取所有的value即可。
方案二:新建一个26位的数组,遍历每一个字符串,统计每个字符串对应的字符属于26个字母中的哪个字母,就在对应的数组位置加1,最后将每个数组拼接成字符串,对应的字符串相同,即为字母异位词。
java代码:
public static List<List<String>> groupAnagrams2(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
int[] count = new int[26];
for (int i = 0; i < str.length(); i++) {
int m = str.charAt(i) - 'a';
count[m]++;
}
StringBuffer buffer = new StringBuffer();
for (int j = 0; j < 26; j++) {
buffer.append(count[j]);
}
List<String> list = map.getOrDefault(buffer.toString(), new ArrayList<>());
list.add(str);
map.put(buffer.toString(), list);
}
return new ArrayList<>(map.values());
}
scala代码:
/**
*对字符串中的字符进行排序
* @param strs
* @return
*/
def groupAnagrams(strs: Array[String]): List[List[String]] = {
val map = new mutable.HashMap[String, ListBuffer[String]]()
for (i <- 0 until strs.length) {
val c: Array[Char] = strs(i).toCharArray
val sorted = c.sorted.mkString("")
if (!map.contains(sorted)) {
map.put(sorted, new ListBuffer[String])
}
val value: ListBuffer[String] = map.getOrElse(sorted, null)
value.append(strs(i))
}
map.values.map(_.toList).toList
}
/**
* 统计字符出现的次数
* @param strs
* @return
*/
def groupAnagrams2(strs: Array[String]): List[List[String]] = {
val map = new mutable.HashMap[String, ListBuffer[String]]()
for (i <- 0 until strs.length) {
val count = new Array[Int](26)
for (c <- strs(i).toCharArray) count(c - 'a') = count(c - 'a') + 1
val key = count.mkString("")
if (!map.contains(key)) {
map.put(key, new ListBuffer[String])
}
map.getOrElse(key, new ListBuffer[String]).append(strs(i))
}
map.values.map(_.toList).toList
}