A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
解:
public class Main {
static TreeSet<String> ts = new TreeSet<>();
static void fun(char[] c, int k) {
if (k == c.length - 1) {
String ss = String.valueOf(c);
// 判断两张相同牌直接的距离是否正确
if (ss.lastIndexOf("A") - ss.indexOf("A") > 1)
if (ss.lastIndexOf("2") - ss.indexOf("2") > 2)
if (ss.lastIndexOf("3") - ss.indexOf("3") > 3)
if (ss.lastIndexOf("4") - ss.indexOf("4") > 4)
ts.add(ss);
return;
}
for (int i = k; i < c.length; i++) {
{
char a = c[i];
c[i] = c[k];
c[k] = a;
}
fun(c, k + 1);
{
char a = c[i];
c[i] = c[k];
c[k] = a;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = "AA223344";
char[] c = s.toCharArray();
fun(c, 0);
System.out.println(ts.pollFirst());// 只输出最小那个
}
}