同じものを含む順列の問題をJavaで解いてみた。

 同じものを含む順列の問題Javaでプログラムを作って解いてみました。(^_^;

YOKOHOMAの8文字(AとOが2つ,YKHMが1つ)を横1列に並べての順列を考える問題です。
ただし,AOという並び,または,OAという並びの少なくとも一方を含むことです。

●PermSame01.java

/*
 * PermSame01.java
 * 
 */

import java.util.Arrays;

class PermSame01 {
    static void swap(char[] s, int i, int j) {
        char t = s[i]; s[i] = s[j]; s[j] = t;
    }
    
    static boolean next_perm(char[] p, int n, int r) {
        int i, j, k;
        if(r <= 0 || n < r) return(false);
        for(i = r + 1; i <= n-1; i++)
            for(j = i; j >= r + 1 && p[j-1] < p[j]; j--)
                swap(p,j,j-1);
        for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
        if(i==0) return(false);
        for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
        swap(p,j,i-1);
        for(k = 0; k <= (n-i-1)/2; k++)
            swap(p,i+k,n-k-1);
        return(true);
    }
    
    static String sSort(String s) {
        char[] c=s.toCharArray();
        
        Arrays.sort(c);
        return(new String(c)); 
    }
    
    public static void main(String[] args) {
        final String P=sSort("YOKOHAMA");
        final int N=P.length();
        final int R=N;
        char[] p=P.toCharArray();       // 順列生成用
        
        long tm=System.nanoTime();      // Timer Start
        int count=0;
        
        do{
            String s=new String(p);
            if(s.contains("AO") || s.contains("OA")) count++;
        }while(next_perm(p,N,R));
        System.out.println("計: "+count);
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

計: 7440
Runtime : 0.007 [sec]

ハッとめざめる確率

ハッとめざめる確率

日本一わかりやすい 坂田アキラの 確率が面白いほどとける本 (坂田アキラの理系シリーズ)

日本一わかりやすい 坂田アキラの 確率が面白いほどとける本 (坂田アキラの理系シリーズ)

細野真宏の確率が本当によくわかる本 (細野真宏の数学が よくわかる本)

細野真宏の確率が本当によくわかる本 (細野真宏の数学が よくわかる本)