扑克序列Java

A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

请填写出所有符合要求的排列中,字典序最小的那个。

例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
解题思路:

  1. 最暴力的解法是先对数组中所有元素进行全排列
  2. 然后进行check(),调用Java提供的lastIndexOf()方法和IndexOf();
  3. 最后删选出的结果有重复,加到集合中就可以去掉重复
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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41765969/article/details/88574129