现在几个小时我一直在对付算法问题。给定一个字符串,计算没有重复(和禁止字符)的字符串排列的数目
问题的(花式)声明如下:
我们的花园有flowers.You单一行中给出该行的当前内容在String花园。花园里的每个角色代表一朵花。不同的字符代表不同的颜色。相同颜色的花朵看起来都一样。你可以按你喜欢的顺序重新排列花园里的花朵。 (正式的,你可以在你的花园里换掉任何两朵花,而且你可以任意多次这样做)。你还得到一个和花园一样长的字符串禁止。你想把花园重新排列成一个新的字符串G,以下条件:
没有两个相邻的花会有相同的颜色。正常情况下,对于每个有效的i,G [i]和G [i + 1]必须不同。 对于每个有效的i,G [i]不能等于禁止[i]。 设X是满足上述所有条件的不同字符串G的数量。计算并返回数字(X取模1,000,000,0007)。
只是为了用一个例子阐明: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-ofa-a- list-without-adjacent-equal-elements/32366585#32366585 – m69