私はアルゴリズムの問題に対して頭を打っています。次のように文字列を指定すると、繰り返しのない文字列(および禁止文字)の並びの数を数えます。
問題の(空想)文は次のとおりです。
私たちの庭には、文字列の庭で、行の現在の内容を与えられているflowers.Youの単一の行が含まれています。庭の各キャラクターは一つの花を表しています。異なる文字は異なる色を表します。同じ色の花はすべて同じに見えます。庭の花を好きな順番に並べ替えることができます。 (正式には、あなたの庭に2本の花を入れ替えることができます。何回も何度でもやることができます)また、庭と同じ長さの弦を禁じられています。庭を新しい弦Gに再配置したい
2つの隣接花は同じ色を持たない。形式上、各有効iについて、G [i]とG [i + 1]は異なる必要があります。 有効な各iについて、G [i]はforbid [i]と等しくてはならない。 Xを上のすべての条件を満たす異なる文字列Gの数とする。数を計算して返す(Xモジュロ1、000、000、007)。
は一例で明確にする:Xを、私は数えることによりしようとしている
( "AAABBB"、 "CCCCCC")= 2( "ABABAB" と "BABABA")は、文字列にどのように多くの文字です(この例では 'a' - > 3、 'b' - > 4)、次に異なる可能性を再帰的に数えます(繰返しまたは禁止された文字がある場合はスキップします)。これらの行の何か:
using Map = std::map < char, size_t > ;
Map hist;
std::string forbid;
size_t countRecursive(std::string s, size_t len)
{
if (len == 0)
return 1;
size_t curPos = s.size() ;
size_t count(0);
for (auto &p : hist) {
auto key = p.first;
if (hist[key] == 0) continue;
if (forbid[curPos] == key) continue;
if (curPos > 0 && s[curPos - 1] == key) continue;
hist[key]--;
count += countRecursive(s + key, len - 1);
hist[key]++;
}
return count;
}
histおよびforbidは、事前に初期化されています。しかし、これはnと思われる! nは< = 15になる可能性があるため、実際には複雑になります。
私は本当に完全な解決策を探していません。あなたが問題に近づくべき方法について何か提案があった場合にのみ、私は非常に感謝しています!
あなたはそのようなアレンジメントの数を数えようとしているのですか、それともそれらを生成しようとしていますか?前者は簡単です。 –
私は数えるだけの努力をしていますが、それでもまだ良い(パフォーマンス上の)ソリューションは考えられません:/ –
http://stackoverflow.com/questions/25285792/generate-all-permutations-of-a- @ 32696585#32366585 – m69