import java.util.*; public class Main { public static void main(String args[]) { String[] s = new Scanner(System.in).nextLine().split(" "); int nums = Integer.parseInt(s[0]); String str = s[s.length - 2]; int index = Integer.parseInt(s[s.length - 1]); List<String> list = new ArrayList<>(); for (int i = 1; i < s.length - 2; i++) { if (isBrother(s[i], str)) list.add(s[i]); } String[] array = new String[list.size()]; list.toArray(array); array = radixSort(array, str.length()); System.out.println(array.length); if(index<array.length) System.out.println(array[index - 1]); } public static boolean isBrother(String s1, String s2) { if(s1.equals(s2)||s1.length()!=s2.length()) return false; int[] cNums = new int[26]; for (char c : s1.toCharArray()) cNums[c - 97]++; for (char c : s2.toCharArray()) cNums[c - 97]--; for (int i : cNums) if (i != 0) return false; return true; } public static String[] radixSort(String[] arr, int digits) { for (int i = digits - 1; i >= 0; i--) arr = countingSort(arr, i); return arr; } public static String[] countingSort(String[] arr, int index) { String[] arr_ = new String[arr.length]; int[] c = new int[26]; for (String s : arr) c[s.charAt(index) - 97]++; for (int i = 1; i < c.length; i++) c[i] = c[i] + c[i - 1]; for (int i = arr.length - 1; i >= 0; i--) { arr_[c[arr[i].charAt(index) - 97] - 1] = arr[i]; c[arr[i].charAt(index) - 97]--; } return arr_; } }
判断是否相等挺简单的,首先判断是不是完全一样或者长度不一样,遇到这两种情况直接false就行
然后再通过分别遍历来比较,只要两个字符串的每个字母的数量都相同,就可以true
排序的话,用radix排序结合counting排序就行。就是从最低位到最高位逐个的进行一次counting排序就完成了。
举个例子:
对204,541,321,531,234,这五个数排序
可以先排最低位个位
变成541,321,531,204,234
然后再排十位
变成204,321,531,234,541
最后排百位
变成204,234,321,531,541