完成,还算顺利
public List<List<String>> groupAnagrams(String[] strs) { //将第一个字符串放进一个数组,之后与前面的组的第一个字符串做比较, // 当出现新的字符的时候,就添加一个新的数组进去, // 依次类推,直到遍历结束,返回结果 //字母异位词,要求知道出现的不同字符有哪些,以及各自出现的次数,字符串长度需要相等 // 这应该用map来存储吧,键为出现的字符,值为次数; //看了别人的思路,可以将字符串的字符按照字母排列顺序进行排序,相同的放置在同一组 int len = strs.length; List<List<String>> list = new ArrayList<>(); if(len == 0 ) { return list; } //创建一个map,用于存放排序之后的结果以及向对应的位置 Map<String,Integer> map = new HashMap<>(); int k = 0; for (String s : strs) { //如何对字符串按字母表的顺序进行排列? char[] c = s.toCharArray(); Arrays.sort(c); //将字符数组拼接起来 String str = join(c); if (!map.containsKey(str)) { map.put(str, k); k++; List<String> l = new ArrayList<>(); l.add(s); list.add(l); } else { //若存在即存入相应数组,不存在则创建新的数组 int index = map.get(str); list.get(index).add(s); } } return list; } private String join(char[] c) { StringBuilder sb = new StringBuilder(); for (char value : c) { sb.append(value); } return sb.toString(); }
其他答案思路相同,形式可简化。
——2020.7.8