文字列を全ての組み合わせで2つに分割する
Posted: 2009年6月09日(火) 10:51
毎度お世話になっております、山崎です。
今回は、文字列の分割についての方法をお伺いに参りました。
ある文字列Sを、考えられる全ての組み合わせで 文字列Aと文字列Bの2つの文字列に分割し、その文字列を得る
というプログラムを考えているのですが、何日考え続けても有効なプログラムが浮かんできません。
分割の条件としては、
・文字列Sは'A'から'Z'までの文字で構成され、同じ文字は2つ以上存在しない。長さは2文字以上。
・各文字列中の文字の並び順が違っても区別しない。"AC"と"CA"は同じもの。(常にA→Zの順でソートされる)
・文字列A,Bは1文字以上。
例えば文字列Sが"ABCD"だとします。
そうするとこれは、(文字列A,文字列B の順番で記述しています)
A,BCD B,ACD C,ABD D,ABC
AB,CD AC,BD AD,BC BC,AD BD,AC CD,AB
ABC,D ABD,C ACD,B BCD,A
この14通りに分割することができます。
文字列Sが"AB"のときは
A,B と B,A の2通りが考えられます。
言うまでもないかもしれませんが、文字列Aが決まれば自動的に文字列Bも決まります。
私は以下のコードのように、文字列Aの文字数によってswitch文を分岐させ、
文字列Aがn文字のときはfor文のn重ループで文字列Sから1ループで1文字ずつ合計n個選びAを決める、
という方法を考えたのですが、この方法ではnが大きな数値のときに対応できません。
文字列型のvectorにpushする、というのが適当でしょうか。
Aが決まればBも自然に決まるので、ここではBを求める処理は記述していません。
どうすれば、文字列Sを上の条件を満たす考えられる全ての組み合わせで2つに分割できるのでしょうか。
今回は、文字列の分割についての方法をお伺いに参りました。
ある文字列Sを、考えられる全ての組み合わせで 文字列Aと文字列Bの2つの文字列に分割し、その文字列を得る
というプログラムを考えているのですが、何日考え続けても有効なプログラムが浮かんできません。
分割の条件としては、
・文字列Sは'A'から'Z'までの文字で構成され、同じ文字は2つ以上存在しない。長さは2文字以上。
・各文字列中の文字の並び順が違っても区別しない。"AC"と"CA"は同じもの。(常にA→Zの順でソートされる)
・文字列A,Bは1文字以上。
例えば文字列Sが"ABCD"だとします。
そうするとこれは、(文字列A,文字列B の順番で記述しています)
A,BCD B,ACD C,ABD D,ABC
AB,CD AC,BD AD,BC BC,AD BD,AC CD,AB
ABC,D ABD,C ACD,B BCD,A
この14通りに分割することができます。
文字列Sが"AB"のときは
A,B と B,A の2通りが考えられます。
言うまでもないかもしれませんが、文字列Aが決まれば自動的に文字列Bも決まります。
私は以下のコードのように、文字列Aの文字数によってswitch文を分岐させ、
文字列Aがn文字のときはfor文のn重ループで文字列Sから1ループで1文字ずつ合計n個選びAを決める、
という方法を考えたのですが、この方法ではnが大きな数値のときに対応できません。
void GetStrA(char* S) { for(int i=1;i<strlen(S);i++) switch(i) { case 1: for(...){ //文字列Sから1文字選び文字列Aとする。 //Aを保存する } break; case 2: for(...) for(...){ //文字列Sから1文字ずつ選び文字列Aに加える //Aを保存する } break; case 3: for(...) for(...) for(...){ //文字列Sから1文字ずつ選び文字列Aに加える //Aを保存する } break; case ... ... } }なお、Sを分割して得た文字列A、Bの保存のやり方は特に指定はありません。
文字列型のvectorにpushする、というのが適当でしょうか。
Aが決まればBも自然に決まるので、ここではBを求める処理は記述していません。
どうすれば、文字列Sを上の条件を満たす考えられる全ての組み合わせで2つに分割できるのでしょうか。