全排列的时间复杂度为:O(N!)

心算法的证明实质是比较复杂的,我们大可不必每次去证明贪心的正确性

package class09;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;

public class Code01_LowestLexicography {

    // 暴力法穷举,排列组合
public static String lowestString1(String[] strs) {
	if (strs == null || strs.length == 0) {
		return "";
	}
	ArrayList<String> all = new ArrayList<>();
	HashSet<Integer> use = new HashSet<>();
	process(strs, use, "", all);
	String lowest = all.get(0);
	for (int i = 1; i < all.size(); i++) {
		if (all.get(i).compareTo(lowest) < 0) {
			lowest = all.get(i);
		}
	}
	return lowest;
}

// strs里放着所有的字符串
// 已经使用过的字符串的下标,在use里登记了,不要再使用了
// 之前使用过的字符串,拼接成了-> path
// 用all收集所有可能的拼接结果
public static void process(String[] strs, HashSet<Integer> use, String path, ArrayList<String> all) {
        // 所有字符串都是用过了
	if (use.size() == strs.length) {
		all.add(path);
	} else {
		for (int i = 0; i < strs.length; i++) {
			if (!use.contains(i)) {
				use.add(i);
				process(strs, use, path + strs[i], all);
				use.remove(i);
			}
		}
	}
}

public static class MyComparator implements Comparator<String> {
	@Override
	public int compare(String a, String b) {
		return (a + b).compareTo(b + a);
	}
}

    // 思路二,贪心解法
public static String lowestString2(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;
}

// for test
public static String generateRandomString(int strLen) {
	char[] ans = new char[(int) (Math.random() * strLen) + 1];
	for (int i = 0; i < ans.length; i++) {
		int value = (int) (Math.random() * 5);
		ans[i] = (Math.random() <= 0.5) ? (char) (65 + value) : (char) (97 + value);
	}
	return String.valueOf(ans);
}

// for test
public static String[] generateRandomStringArray(int arrLen, int strLen) {
	String[] ans = new String[(int) (Math.random() * arrLen) + 1];
	for (int i = 0; i < ans.length; i++) {
		ans[i] = generateRandomString(strLen);
	}
	return ans;
}

// for test
public static String[] copyStringArray(String[] arr) {
	String[] ans = new String[arr.length];
	for (int i = 0; i < ans.length; i++) {
		ans[i] = String.valueOf(arr[i]);
	}
	return ans;
}

public static void main(String[] args) {
	int arrLen = 6;
	int strLen = 5;
	int testTimes = 100000;
	String[] arr = generateRandomStringArray(arrLen, strLen);
	System.out.println("先打印一个生成的字符串");
	for (String str : arr) {
		System.out.print(str + ",");
	}
	System.out.println();
	System.out.println("test begin");
	for (int i = 0; i < testTimes; i++) {
		String[] arr1 = generateRandomStringArray(arrLen, strLen);
		String[] arr2 = copyStringArray(arr1);
		if (!lowestString1(arr1).equals(lowestString2(arr2))) {
			for (String str : arr1) {
				System.out.print(str + ",");
			}
			System.out.println();
			System.out.println("Oops!");
		}
	}
	System.out.println("finish!");
}

}
Absorbing material: www.goodsmaterial.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值