一.题目描述
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
二.代码
import java.util.HashSet;
import java.util.Set;
public class test1{
static Set<String> set = new HashSet<String>();//HashSet去重
public static void main(String[] args){
char ch[] = {'A','A','2','2','3','3','4','4'};//初始化字符数组
f(ch,0,ch.length-1);//方法调用---->全排列
for(String x :set){//遍历输出
System.out.println(x);
}
}
public static void f(char []ch,int start,int end){
if(start==end){
String s = new String(ch);//将字符转换为字符串
if(check(s)){
set.add(s);//去重,放在set容器中
}
}
//全排列套用模板
for(int i=start;i<ch.length;i++){
char t=ch[i];
ch[i]=ch[start];
ch[start]=t;
f(ch,start+1,end);
t=ch[i];
ch[i]=ch[start];
ch[start]=t;
}
}
//判断是否满足题意:
// s.lastIndexOf()指字符串中最后一次出现该字符的下标
// s.indexOf()指字符串中第一次出现该字符的下标
public static boolean check(String s){
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;
}else{
return false;
}
}
}
三.知识点
1.indexOf() 与lastIndexOf() 用法详解:
indexOf(x):返回第一个字符x的下标
lastIndexOf():返回最后一个字符x的下标