12 lines Java solution with explanation

• ``````public List<List<String>> groupStrings(String[] strs) {
//Create a hashmap. key is a number (the offset compared to its first char),
//value is a list of strings which have the same offset.
//For each string, convert it to char array
//Then subtract its first character for every character
//eg. "abc" -> "0,1,2,"        "am"->"0,12,"
Map<String,List<String>> map = new HashMap<>();
for(String str : strs) {
String key = "";
char first = str.charAt(0);
for(char c:str.toCharArray())
key+=(c-first<0?c-first+26:c-first)+",";
if(!map.containsKey(key))
map.put(key,new ArrayList<String>());
}
for(String key:map.keySet())
Collections.sort(map.get(key));
return new ArrayList<List<String>>(map.values());
}``````

• @jinnyren Really concise solution.

Here's mine. Same idea!

``````public List<List<String>> groupStrings(String[] strings) {
Map<String, List<String>> map = new HashMap<>();

for(String s : strings) {
String key = getKey(s);
List<String> list = map.getOrDefault(key, new ArrayList<>());
map.put(key, list);
}
return new ArrayList<>(map.values());
}

private String getKey(String s) {
char[] chars = s.toCharArray();
String key = "";
for(int i = 1; i < chars.length; i++) {
int diff = chars[i] - chars[i-1];
key += diff < 0 ? diff + 26 : diff;
key += ",";
}
//System.out.println(key);
return key;
}``````

Looks like your connection to LeetCode Discuss was lost, please wait while we try to reconnect.