A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
解题思路:
- 最暴力的解法是先对数组中所有元素进行全排列
- 然后进行check(),调用Java提供的lastIndexOf()方法和IndexOf();
- 最后删选出的结果有重复,加到集合中就可以去掉重复
import java.util.HashSet;
import java.util.Set;
public class Demo_5_07 {
public static void main(String[] args) {
char[] arr=new char[] {'A','A','2','2','3','3','4','4'};
f(arr,0);
for(String s:set) {
System.out.println(s);
}
}
//1、Set集合可以去掉重复的字符串
static Set<String> set=new HashSet<String>();
public static void f(char[] arr,int k) {
if(k==arr.length) {
//printf(arr);
String s=new String(arr);
if(check(s)) {
set.add(s);
}
}
//2、递归,对所有字符进行全排列,然后进行筛选,模版不过多说了
for(int i=k;i<arr.length;i++) {
char t=arr[k];
arr[k]=arr[i];
arr[i]=t;
f(arr,k+1);
//3、回溯
t=arr[k];
arr[k]=arr[i];
arr[i]=t;
}
}
public static void printf(char[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]);
}
System.out.println();
}
public static boolean check(String s) {
//因为是数组下标所以为end-first+1
if(s.lastIndexOf('A')-s.indexOf('A')==2&&
s.lastIndexOf('2')-s.indexOf('2')==3&&
s.lastIndexOf('3')-s.indexOf('3')==4&&
s.lastIndexOf('4')-s.indexOf('4')==5) {
return true;
}
return false;
}
}