import java.util.*; public class Main { public static ArrayList<ArrayList<String>> groupShiftedStrings(String[] strs) { //make difference between characters as key and group strings HashMap<String , ArrayList<String>> map = new HashMap<>(); for(String temp : strs){ char arr[] = temp.toCharArray(); //if only single character its key will be blank or "" String val = ""; for(int i =1 ;i < arr.length ; i++){ int value = (arr[i] - arr[i-1]); //handle if value comes out to be negative eg: y-a if(value < 0 ) value += 26 ; val += value + "#"; } val += "."; // for one character it will be "." ArrayList<String> list = map.getOrDefault(val,new ArrayList<>()); list.add(temp); map.put(val , list); } //making an answer arralist and traversing the hashmap and storing the answers ArrayList<ArrayList<String>> ans = new ArrayList<>(); for(String temp : map.keySet()){ ans.add(map.get(temp)); } return ans; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); String[] arr = new String[N]; for (int i = 0; i < N; i++) { arr[i] = sc.next(); } ArrayList<ArrayList<String>> shiftedGroup = groupShiftedStrings(arr); for (ArrayList<String> lst : shiftedGroup) { Collections.sort(lst); } shiftedGroup.sort(new ListComparator()); display(shiftedGroup); } // it is used to make the result unique static class ListComparator implements Comparator<List<String>> { @Override public int compare(List<String> l1, List<String> l2) { if (l1.size() != l2.size()) { return l2.size() - l1.size(); } String l1str = l1.get(0); String l2str = l2.get(0); return l1str.compareTo(l2str); } } public static void display(ArrayList<ArrayList<String>> list) { for (int i = 0; i < list.size(); i++) { ArrayList<String> currList = list.get(i); for (int j = 0; j < currList.size(); j++) { System.out.print(currList.get(j) + " "); } System.out.println(); } } }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter