import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param strs string字符串一维数组 * @return string字符串一维数组 */ public static String[] groupAnagrams (String[] strs) { // write code here Arrays.sort(strs); LinkedList<LinkedList<String>> linkedLists = new LinkedList<>(); for (int i = 0; i < strs.length; i++) { boolean flag = false; for (int j = 0; j < linkedLists.size(); j++) { if (isSameConstruct(strs[i], linkedLists.get(j).get(linkedLists.get(j).size() - 1))) { linkedLists.get(j).add(strs[i]); flag = true; break; } } if (!flag) { LinkedList<String> linkedList = new LinkedList<>(); linkedList.add(strs[i]); linkedLists.add(linkedList); } } String[] strings = new String[linkedLists.size()]; for (int i = 0; i < linkedLists.size(); i++) { strings[i] = concat(linkedLists.get(i)); } return strings; } public static String concat(LinkedList<String> linkedList) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < linkedList.size(); i++) { stringBuffer.append(linkedList.get(i) + ","); } return stringBuffer.substring(0, stringBuffer.length() - 1); } public static boolean isSameConstruct(String string1, String string2) { if (string1.length() != string2.length()) { return false; } Map<Character, Integer> map1 = new HashMap<>(); Map<Character, Integer> map2 = new HashMap<>(); for (int i = 0; i < string1.length(); i++) { map1.put(string1.charAt(i), map1.getOrDefault(string1.charAt(i), 0) + 1); } for (int j = 0; j < string2.length(); j++) { map2.put(string2.charAt(j), map2.getOrDefault(string2.charAt(j), 0) + 1); } for (Map.Entry<Character, Integer> myMap : map1.entrySet()) { if (!myMap.getValue().equals(map2.get(myMap.getKey()))) { return false; } } return true; } }
本题主要考察的知识点是字符串,所用编程语言是java.
我额外定义了两个函数,一个函数用于判断两个字符串是否由相同的字符组成,一个函数用于将LinkedList里面存储的字符串转化为一个字符串,剩下的就是遍历整个字符串数组就行了。