贪心算法-字符串拼接问题(字典序)

题目:给定一个字符串的数组strs,实现一种拼接顺序,使得所有的字符串拼接起来组成的字符串是所有可能性中字典序最小的,并返回这个字符串。

相关知识:

Java compareTo() 方法

  • 字符串与对象进行比较。
  • 按字典顺序比较两个字符串。

一、什么是字典序

①若字符串长度相等:“abc”和“bck”比较?

将它们看成数和数的比较即可。从最高位开始比,a的ASCII码值小于b的ASCII码。所以"abc"小于“bck”。

②若字符串长度不相等:“b"和"ba"比较?

首先在字符串长度小的“b”后面补上ASCII码值最小的数(这里为了方便就写成0)。变成"b0"和"ba"进行比较。

先看最高位都是b,然后看第二位“0”<"a"。所以“b”小于“ba”。

二、soulution

字符串各自按照字典序排,比较前一个字符串拼接后一个字符与后一个字符串拼接上前一个字符串,取拼接后字符串字典序小的那个

代码:

package Algorithms.greed;

import java.util.Arrays;
import java.util.Comparator;

public class LowestLexicography {

    //自定义比较策略(两个字符串按字典序进行比较)
    public static class MyComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            return (a + b).compareTo(b + a);
        }
    }

    public static String lowestString(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        Arrays.sort(strs, new MyComparator());
        String res = "";
        for (int i = 0; i < strs.length; i++) {
            res += strs[i];
        }
        return res;
    }

    public static void main(String[] args) {
        String[] strs1 = { "jibw", "ji", "jp", "bw", "jibw" };  //bwjibwjibwjijp
        System.out.println(lowestString(strs1));

        String[] strs2 = { "ba", "b" };
        System.out.println(lowestString(strs2)); //bab

    }

}

 

上一篇:JS权威指南读书笔记(六)


下一篇:14. 最长公共前缀