热点机考-考古问题

255 阅读1分钟

题目:考古问题,假设以前的石碑被打碎成了很多块,每块上面都有一个或若干个字符,请你写个程序来把之前石碑上文字可能的组合全部写出来,排序按大小升序

import java.util.*;


public class test{

    public static void main(String[] args) {


        Scanner sc = new Scanner(System.in);
        //read
        while (sc.hasNext()) {
            List<String> list = new LinkedList<>();
            String s = sc.nextLine();
            char[] chars = s.toCharArray();
            for (char c : chars) {
                list.add(String.valueOf(c));
            }
            //主要逻辑就是列表中取出一个元素  然后放到不同的位置,  再把列表翻转,重复上面的逻辑
            List<String> mergeList = new ArrayList<>();
            mergeList = combination(list,mergeList);
            Collections.reverse(list);
            mergeList = combination(list,mergeList);

            System.out.println(mergeList);

        }
    }


    public static List<String> combination(List<String> list,List<String> mergeList){
        int length = list.size();
        int putIndex = 0;
        for (int i = 0; i < list.size(); i++) {
            String putItem = list.get(i);
            list.remove(i);

            while(putIndex <= length){
                StringBuilder builder = new StringBuilder();
                for (int j = 0; j < list.size(); j++) {

                    if(putIndex ==j){
                        builder.append(putItem);
                    }
                    builder.append(list.get(j));

                }
                if(putIndex >= list.size()){
                    builder.append(putItem);
                }
                if(!mergeList.contains(builder.toString())){
                    mergeList.add(builder.toString());
                }
                putIndex++;
            }
            list.add(i,putItem);
            putIndex = 0;

        }
        return mergeList;
    }


}

结果: image.png