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;
}
}


京公网安备 11010502036488号