□投稿者/ ID非公開 (1回)-(2007/12/06(Thu) 15:24:52)
|
初めて投稿します。
επιστημη さんのアルゴリズムで書いていけばよいと思います。
(私にはとても考え付きませんでした・・・)
> N文字あるとき、1~2^N-1 の数を二進表現にすりゃいいんじゃね?
>
> あいう
> 001 = う
> 010 = い
> 011 = いう
> 100 = あ
> 101 = あう
> 110 = あい
> 111 = あいう
ちなみに、
>【追記】コードにコメントいれマス。このビット判定も数に限界ありマスね。
この点は問題ないと思います。
なぜなら、32ビットでも組み合わせの数は40億通りを越えるので、
結果を格納する文字列のサイズが4GBを遥かに超えてしまうためです。
ためしに作ってみたコードを提示します(VBですが・・・)
この関数は
「あ い う え」を渡すと
「あ い あい う あう いう あいう え あえ いえ あいえ
うえ あうえ いうえ あいうえ」を返します。
Public Shared Function Sample01(ByVal input As String) As String
'全角スペースは半角に変換
input = input.Replace(" ", " ")
'配列に分割(空要素は入らない)
Dim sep() As String = {" "}
Dim Allinput() As String = input.Split(sep, StringSplitOptions.RemoveEmptyEntries)
Dim cnt As Integer = Allinput.Length
If cnt >= 33 Then Throw New ArgumentException("要素の数は32個以内にしてください")
Dim sb As New StringBuilder
'ここからメインの処理
For src As UInt32 = 1 To Convert.ToUInt32(2 ^ cnt - 1)
Dim mask As UInt32 = 1
For i As Integer = 1 To cnt
'ビットが立っていれば文字を追加
If (src And mask) = mask Then
sb.Append(Allinput(i - 1))
End If
'型変換しないとエラーになる(なぜ?)
mask = Convert.ToUInt32(mask * 2)
Next
sb.Append(" ")
Next
Return sb.ToString
End Function
以上です。
|
|