思路: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)); } } }