题目
代码
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import javax.swing.text.html.HTMLDocument.Iterator;
/**
*
*/
/***
* @author 18071
* @Date 2019年3月18日
* 小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。)
例如: s = "ABAB",那么小易有六种排列的结果:
"AABB","ABAB","ABBA","BAAB","BABA","BBAA"
其中只有"AABB"和"BBAA"满足最多只有一对不同颜色的相邻砖块。
* 功能:
***/
public class test {
public static void main(String args[]) {
Scanner s =new Scanner(System.in);
String rua =s.nextLine();
solution solu =new solution();
solu.so(rua);
}
}
//思路 使用 hashmap 保存所有的值 ,找出 存在一堆的砖块 颜色 然后 做全排列
class solution{
HashMap<String,Integer> map =new HashMap<String,Integer>();
public void so(String s) {
String[] array = s.split("");
for(int i=0;i<array.length;i++) {
if(map.containsKey(array[i])) {
int temp =map.get(array[i]);
temp++;
map.put(array[i], temp);
}
else {
map.put(array[i], 1);
}
}
//放入占中 ,获取 存在一队的颜色个数 map的遍历~~~~
Set<Entry<String,Integer>> set =new HashSet<Entry<String,Integer>>();
set =map.entrySet();
// Iterator it =(Iterator) set.iterator();
int count =0;
for( Entry<String ,Integer> en :set) {
if(en.getValue()>1) {
count++;
}
}
if(count==0|| count>2){
System.out.println(0);
}
else if(count>=1) {
//得到 总的对数
int res = 1;
for(int i=1 ;i<=count ;i++) {
res = i*res;
}
System.out.println(res);}
}
}
