山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

[yukicoder] No.170 スワップ文字列(Easy)

問題

No.170 スワップ文字列(Easy) - yukicoder

重複順列に関する問題なので、出現した文字の個数をカウントしていく必要があります。長さが1の部分文字列として、equals()メソッドを使ってもいいんですが、文字コードと配列の添え字を対応させることで、出現する文字をカウントできます。

考え方

Javaの環境では'A'という文字を整数で表すと65になります。また、'B'は66なので、アルファベットの総数が26であることから、長さが26の配列 \rm{c} [ \cdot ]を用意します。

ここで、'A'の出現回数を調べるには、charをintにキャストして、

 c[(int) A - 65] ++;

とすれば、 \rm{c} [ 0 ] が'A'の出現回数となります。

あとは、階乗を求めて答えを導きます。

コード

import java.util.Scanner;

public class Exec0170 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String N = scan.next();
        scan.close();
        int l = N.length();
        int []c = new int[26];
        for(int i = 0; i < l; i++) {
            char t = N.charAt(i);
            c[t - 65]++;
        }
        int num = fact(l);
        int den = 1;

        for(int i = 0; i < 26; i++) {
            if(c[i] != 0) {
                den *= fact(c[i]);
            }
        }
        System.out.println(num / den - 1);
    }
    static int fact(int n) {
        if(n == 1) {
            return 1;
        }else {
            return n * fact(n - 1);
        }
    }
}