数据结构与算法分析笔记与总结(java实现)--字符串9:拼接最小字典序练习题

来源:互联网 发布:淘宝金号毛巾旗舰店 编辑:程序博客网 时间:2024/05/22 13:05

题目:对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。给定一个字符串数组strs,同时给定它的大小,请返回拼接成的串。

测试样例:["abc","de"],2"abcde"

思路:类似于题目Array6: 把数组排成最小的数。对于这一类要求拼接得到字面结果最小或者最大的问题,最优的阶梯思路是这样的:对于给定的数组中的元素进行排序,排序的逻辑不再是使用传统的比较数值大小或者比较ascii码的大小,而是通过自定义一个大小的比较器Comparator,并实现compareTo()方法来比较两个元素之间的大小,这个大小如何定义呢?对于str1和str2,如果str1+str2<str2+str1那么说明要想使得拼接后的结果小,应该让str1排在str2的前面。(由于str1+str2和str2+str1得到的结果字符串是长度相同的两个字符串,他们的比较就是比较他们的字典序,可以使用字符串String已有的conpareTo()方法来进行比较,其原理还是逐个位置比较ascii码,由于ascii码的顺序和字典序相同,所以可以使用ascii码的比较来代替字典序的比较)--定义好了大小比较规则后,使用这种自定义的比较器来对数组进行排序,可以直接使用排序的类库Arrays.sort(new Comparator());最终将最小排序下的元素拼接成为字符串就是字典序最小的字符串。这种通过自定义大小比较准则来进行排序使得最终组合最小的方法正确性可以通过数学方法来证明,现在直接承认即可。

常识:Comparable接口中是compareTo()方法,String实现是Comparable接口;定义比较器需要实现的是Comparator接口,Comparator中的是compare()方法,注意compareTo()和compare()方法的返回值都是int而不是boolean,返回的值可能是0123-1等任意值,但是比较器会自动根据正负值来判断大小从而决定排列顺序。在自定好大小比较器之后进行排序时还是依赖于Java的类库来实现排序的。

importjava.util.*;

//已知各个字符元素,将其进行排列使得合成后的字符串字典序最小:使用自定义比较器Comparator来实现

publicclass Prior {

    public String findSmallest(String[] strs,int n) {

       //特殊输入

        if(strs==null||strs.length<0) returnnull;

        if(strs.length==0) return "";

       

       //使用自定义的大小比较器对数组进行排序

        Arrays.sort(strs,new MyComparator());

       

       //返回拼接后的字符串

        String result="";

        for(int i=0;i<strs.length;i++){

            result+=strs[i];

        }

       

        return result;

    }

}

//定义一个自己的比较器

classMyComparator implements Comparator<String>{

   //重写compare方法

    @Override

    public int compare(String str1,Stringstr2){

        String s1=str1+str2;

        String s2=str2+str1;

        return s1.compareTo(s2);

    }

}
0 0
原创粉丝点击