思路:1.把目标字符串分解成char放入list集合中。
2.把字符串数组中的字符串依次与目标字符串比较。
1)如果当前字符串的当前字符在list集合中存在,那么删除list集合中的该字符。当当前字符串的最后一个字符比较完并且list集合为空,那么将当前字符串加入out集合中。
2)若不存在则break,进行下一个字符串的比较。
3.对out集合进行排序。
4.输出out集合的长度
5.若k<=out的长度,则输出。否则不输出。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            ArrayList<String> out=new ArrayList<>();//收集兄弟字符串
            int n = in.nextInt();
            String[] strs=new String[n];
            for(int i=0;i<n;i++){
                strs[i]=in.next();
            }
            String target=in.next();//目标字符串
            int k=in.nextInt();
            ArrayList<Character> list=new ArrayList<>();//存放目标字符串的字符
            for(int i=0;i<target.length();i++){
                list.add(target.charAt(i));
            }
            for(int j=0;j<strs.length;j++){//遍历字符串数组
                if(!target.equals(strs[j])){//去除与目标字符串一样的字符串
                    ArrayList<Character> tmp=new ArrayList<>(list);//因为涉及到集合的remove,每次都需要从list取。
                    for(int m=0;m<strs[j].length();m++){//遍历当前字符串
                        int index=tmp.indexOf(strs[j].charAt(m));
                        if(index!=-1){//若当前字符串的当前字符在集合中存在
                            tmp.remove(index);
                            if(m==strs[j].length()-1 && tmp.isEmpty()){//若遍历到最后一个字符,且list也为空。
                                out.add(strs[j]);
                                break;
                            }
                        }else{//不存在,直接进行下一个字符串比较
                            break;
                        }
                    }
                }
            }
            Collections.sort(out);//排序
            System.out.println(out.size());
            if(k<=out.size()){
                System.out.println(out.get(k-1));
            }
        }
    }