/* *249.Group Shifted Strings *2016-6-18 by Mingyang *Given a string, we can "shift" each of its letter to its successive letter, *for example: "abc" -> "bcd". We can keep "shifting" which forms the sequence: *"abc" -> "bcd" -> ... -> "xyz" *Given a list of strings which contains only lowercase alphabets, *group all strings that belong to the same shifting sequence. *For example, given: ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"], *Return: *[ * ["abc","bcd","xyz"], * ["az","ba"], * ["acef"], * ["a","z"] *] *这个题目一看就是HashMap,刚开始我说那String的长度来存作为key,但是发现相同长度的string可能不为同一阵营 *所以后面该用一个新的string,就是把每两个字符之间的差存起来,写出一个string *["eqdf", "qcpr"]。 *((‘q’ - 'e') + 26) % 26 = 12, ((‘d’ - 'q') + 26) % 26 = 13, ((‘f’ - 'd') + 26) % 26 = 2 *((‘c’ - 'q') + 26) % 26 = 12, ((‘p’ - 'c') + 26) % 26 = 13, ((‘r’ - 'p') + 26) % 26 = 2 *所以"eqdf"和"qcpr"是一组shifted strings。 */ public List<List<String>> groupStrings(String[] strings) { List<List<String>> result = new ArrayList<List<String>>(); HashMap<String, List<String>> d = new HashMap<String, List<String>>(); for(int i = 0; i < strings.length; i++) { StringBuffer sb = new StringBuffer(); for(int j = 0; j < strings[i].length(); j++) { sb.append(Integer.toString(((strings[i].charAt(j) - strings[i].charAt(0)) + 26) % 26)); sb.append(" "); } String shift = sb.toString(); if(d.containsKey(shift)) { d.get(shift).add(strings[i]); } else { List<String> l = new ArrayList<String>(); l.add(strings[i]); d.put(shift, l); } } for(String s : d.keySet()) { Collections.sort(d.get(s)); result.add(d.get(s)); } return result; }