java解法:
1)明确两种情况是必须排除的:长度与目标单词的长度不等则肯定不是兄弟单词;长度相等的时候,待测单词等于目标单词的肯定不是兄弟单词;排除这两种情况。
2)排除上面两种情况之后,就判断待测单词是否可以由目标单词打乱字母顺序得来:可将待测单词和目标单词转换成字符数组,对它们进行排序,然后逐个比较是否全相同,排序后的两个字符数组相等的则为兄弟单词
注意:最后得到的兄弟单词是允许有重复出现的,所以不要用集合HashSet等,用长度可变的ArrayList
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = Integer.parseInt(sc.next()); String[] str = new String[n]; for(int i = 0; i<n; i++){ str[i] = sc.next(); } String s = sc.next(); int k = Integer.parseInt(sc.next()); ArrayList<String> ts = new ArrayList<>(); for(int i=0; i<n; i++){ if(brother(s, str[i])){ ts.add(str[i]); } } System.out.println(ts.size()); Collections.sort(ts); if(k>ts.size()) System.out.println(); else System.out.println(ts.get(k-1)); } } public static boolean brother(String s1, String s2){ int len1 = s1.length(); int len2 = s2.length(); if(len1 != len2) return false;//如果两个单词长度不相等,那肯定不是兄弟单词 int n = 0; for(int i=0; i<len1; i++){ //如果待测单词等于它本身,则不是兄弟单词 if(s1.charAt(i)==s2.charAt(i)) n++; } if(n==len1) return false; char[] ch1 = s1.toCharArray(); char[] ch2 = s2.toCharArray(); //排除上面长度不等、等于目标单词两种情况后,将单词转换为字符数组,然后排序,再逐个对比是否相等 Arrays.sort(ch1); Arrays.sort(ch2); boolean flag = true; for(int i=0; i<len1; i++){ if(ch1[i] != ch2[i]) flag = false; } if(flag) return true; else return false; } }