1

(C ++!言及すべきかどうかわかりませんでした)(可能な限り注文を続けてください!)

文字列ABaCを持っているとしましょう。

その文字列の各文字は、tempというベクトルにあります。

したがって、temp [0] = A、temp [1] = B、temp [3] = a、temp [4]=Cになります。

私がやりたいのは、その文字列のすべての順列を出力するプログラムです。これは、0個の大文字、次に1個の大文字、次に2個の大文字、次に3個すべてを削除した結果です。

私が首都を削除する理由は...あなたは首都に焦点を当てるべきではありません。たまたまここですべての大文字を削除する必要がありましたが、たとえばADbdの場合、Dを削除する必要はありません。つまり、文字列から既知の文字のセットを削除するためのアルゴリズムです。

したがって、次のように出力されます。

ABaC | BaC | AaC | ABa | aC | Aa | Ba | a

ここで効率を求めていないか、アルゴリズムがあまりにも優れています。シンプルで長い、または短くて愚かな何か私も満足しています。

これは私が取り組んでいる進行中のプロジェクトの一部であり、ラムダプロダクションを削除します(これはあなたがすでに助けてくれました)したがって、これはルールからnull許容変数を削除することによって新しいプロダクションルールを構築する必要があるステップです。 1つずつ、というように、すべての順列を出力します。

しかし、y'allはそのビットを無視することができます。文字列と同じように考えてください。だから、どんな助けでも大歓迎です。

よろしくお願いします。

4

3 に答える 3

2

使用している言語がわからないため、以下に概要の手順を示します。

  1. 文字列をウォークスルーし、capitalIndexes大文字が存在するすべてのインデックスのセットを作成します。
  2. のべsき集合の各セットについて、のインデックスにある文字を除く文字列の各文字を出力してから、を出力します。capitalIndexess\n

ここでの唯一の複雑なビットは、パワーセットの生成です。これは、C++でこれを行う手段を提供する別の答えです。

于 2012-12-01T02:12:56.643 に答える
2

ここでは、3つの大文字と8つのソリューションを紹介します。それはあなたにアイデアを与えるはずです(2 ^ 3 = 8)。

大文字がn個ある場合は、0-> 2 ^ n-1の数字をループします。数字ごとに、その2進表現を使用して、大文字が含まれているかどうかを判断します。

000-> a

001-> aC

010-> Ba

011-> BaC

于 2012-12-01T02:16:43.070 に答える
1

あなたは言語を指定しなかったので、私はそれを疑似言語で書きます:

Function(string temp, int startindex):

output temp
for i = startindex to temp.length-1 {
  if temp[i] is capital {
    temp.remove(i)
    Function(temp.clone(), i)
  }
}

あなたはそれをで始めますFunction(temp, 0)

おそらくあなたが望む以外の順序で結果を与えることに注意してください。(あなたの質問から、順序があなたにとってどれほど重要かはわかりません。)

于 2012-12-01T02:16:01.413 に答える