题目描述
给定一个只包含大写英文字母的字符串S,要求你给出对S重新排列的所有不相同的排列数。
如:S为ABA,则不同的排列有ABA、AAB、BAA三种。
解题思路
先把每个字符当成唯一出现过一次,计算所有排列数;再统计重复出现的字母,除去每个字母的排列次数
例如
对于ABA,当成三个不同字符则排列数为:
S
总
=
A
3
3
S_总=A_3^3
S总=A33,其中A出现两次,排列数为:
S
A
=
A
2
2
S_A=A_2^2
SA=A22,B出现两次,排列数为:
S
B
=
A
1
1
S_B=A_1^1
SB=A11,最终计算得:
S
=
S
总
/
(
S
A
∗
S
B
)
=
3
∗
2
∗
1
/
(
2
∗
1
∗
1
)
=
3
S=S_总/(S_A*S_B)=3*2*1/(2*1*1)=3
S=S总/(SA∗SB)=3∗2∗1/(2∗1∗1)=3
代码:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* 题目描述
* 给定一个只包含大写英文字母的字符串S,要求你给出对S重新排列的所有不相同的排列数。
* 如:S为ABA,则不同的排列有ABA、AAB、BAA三种
*
* 解题思路:先把每个字符当做唯一出现,再除去相同字母的排列次数
*/
public class ReSortChars {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
char[] chars = s.nextLine().toCharArray();
Map<Character, Integer> map = new HashMap<Character, Integer>();
int num = 0;
for (char ch:chars) {
if(null == map.get(ch)) {
num = 0;
} else {
num = map.get(ch);
}
map.put(ch,num + 1);
}
int allSort = SortOne(chars.length);
for (char key : map.keySet()) {
allSort = allSort/SortOne(map.get(key));
}
System.out.println(allSort);
}
static int SortOne (int charsnum) {
if (charsnum == 1) {
return 1;
}
return charsnum * SortOne(charsnum - 1);
}
}