現在幾個小時我一直在對付算法問題。給定一個字符串,計算沒有重複(和禁止字符)的字符串排列的數目
問題的(花式)聲明如下:
我們的花園有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