题目描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如:ab和ba是兄弟单词。ab和ab则不是兄弟单词。
现在给定你n个单词,另外再给你一个单词str,让你寻找str的兄弟单词里,按字典序排列后的第k个单词是什么?
注意:字典中可能有重复单词。本题含有多组输入数据。
输入描述
先输入单词的个数n,再输入n个单词。 再输入一个单词,为待查找的单词x 最后输入数字k
输出描述
输出查找到x的兄弟单词的个数m 然后输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出
解题思路
我们可以从这个题看出,判断词典中的单词和要查的单词是不是包含相同的字母,属于查找字符串类型,然后将兄弟单词按典序排序,这里我用了map来记录要查单词每个字母出现次数,词典中的单词如果存在这个字母,让map的key对应的value-1,最后检查如果map中每一个key对应的value都为0,那么就是兄弟单词
代码如下
import java.util.*;
public class Main{
public static boolean IsOk(String str,String s){
if(str.length() != s.length()||str.equals(s))return false;
Map<Character,Integer> map = new HashMap<>();
for(int i = 0;i < s.length();i++){//原单词
if(map.containsKey(s.charAt(i))){
map.put(s.charAt(i),map.get(s.charAt(i)) + 1);
}else{
map.put(s.charAt(i),1);
}
}
for(int i = 0;i < str.length();i++){//词典
if(map.containsKey(str.charAt(i))){
map.put(str.charAt(i),map.get(str.charAt(i)) - 1);
}else{
return false;
}
}
for(Map.Entry<Character,Integer> entry:map.entrySet()){
Character Key = entry.getKey();
Integer Value = entry.getValue();
if(Value != 0)return false;
}
return true;
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();
int i = 0;
String[] str = new String[n];
while(i < n){
str[i++] = scan.next();
}
String ret = scan.next();
int k = scan.nextInt();
List<String> list = new ArrayList<>();
for(i = 0;i < str.length;i++){//字典
boolean tmp = IsOk(str[i],ret);
if(tmp == true){
list.add(str[i]);//兄弟单词集合
}
}
Collections.sort(list);
System.out.println(list.size());
if(list.size() >= k)
System.out.println(list.get(k-1));
}
}
}