给定一个字符串,要求给出重新排列的所有不相同的排列数

题目描述
给定一个只包含大写英文字母的字符串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/(SASB)=321/(211)=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 map = new HashMap();
		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);
	}
}

你可能感兴趣的:(给定一个字符串,要求给出重新排列的所有不相同的排列数)