求解暗黑字串(網易2017秋招)

2022-02-20 16:08:26 字數 2361 閱讀 5565

問題描述:乙個只包含'a'、'b'和'c'的字串,如果存在某一段長度為3的連續子串中恰好'a'、'b'和'c'各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。

例如:baacaaccbaaa 連續子串"cba"中包含了'a','b','c'各乙個,所以是純淨的字串

aabbccaabb 不存在乙個長度為3的連續子串包含'a','b','c',所以是暗黑的字串

你的任務就是計算出長度為n的字串(只包含'a'、'b'和'c'),有多少個是暗黑的字串 (1 ≤ n ≤ 30)。

首先如果題目是如何判斷乙個字串是暗黑(純淨)字串,你會怎麼解?

這個問題很簡單,直接遍歷判斷連續的三個字元是否分別為abc。額,而我想說的是有乙個比較好的想法是

令a=2,b=3,c=5,如果某三個字母乘積為30,即這個字串為純淨的字串。儘管操作起來比直接判斷連續3個字串是否為abc便利不了多少,但是我覺得這是乙個比較好的想法。

講回正題,現在是計算出長度為n的字串,有多少個暗黑的字串。

下面提供2種思路

思路1當n=1時,3種情況,暗黑,

當n=2時,9種情況,暗黑。

當n=3時,第乙個位置3種情況,第二個位置3種情況,而第三個位置則要考慮前2個位置,

如果前2個位置相同則第三個位置有三種選擇,否則有2種選擇。

所有有 3*(3*1+2*2)=21是暗黑的。

當n=4時,按照n=3的情況繼續類推下去,假若第二個位置和第三個位置相同,第四個位置有3種選擇,否則有2種選擇。

如此類推可得出下列規律

當n>3,sum(n) = 3*(3*num3(n) + 2*num2(n))

num2(n) = 2*num3(n-1) + num2(n-1)

num3(n) = num3(n-1) + num2(n-1)

觀察上面第乙個式子3*(3*1+2*2)=21 ,num2(1)=2  num3(1)=1

這個思路主要是從式子裡推出來的,也是比較常規的乙個方法。

def

dark1():

dark = [3,9]

num2 = 2num3 = 1

for i in range(28):

num3,num2 = num2+num3,2*num3+num2

print(dark)

執行結果:

[3, 9, 21, 51, 123, 297, 717, 1731, 4179, 10089, 24357, 58803, 141963, 342729, 827421, 1997571, 4822563,

11642697, 28107957, 67858611, 163825179, 395508969, 954843117, 2305195203, 5565233523, 13435662249,

32436558021, 78308778291, 189054114603, 456417007497]

思路2正如上面的思路1,我們可以分析出,每增加乙個位置的字元,要使其保持暗黑的性質,只需要考慮前2個字元。

當前2個字元相同,那麼第n個位置的取法有3種,否則有2種。

不妨設前2個字元相同的情況為s(n),前2個字元不同為d(n),那麼我們可得出

sum(n) = 3*s(n-1) + 2*d(n-1) = 2*(s(n-1)+d(n-1)) + s(n-1) = 2*sum(n-1) + s(n-1)

因為前個字元要不就是d(n)要不就是s(n),所以d(n)+s(n)就等於sum(n),剩下的問題就是求解s(n-1)。

我們知道,對於s(n-1) aa 第三個字母只能跟之前一樣aaa才能得到s(n),對於d(n-1) ab 第三個字元只有跟最後乙個一樣abb才能得到s(n)

所以得出結論 s(n) = s(n-1) + d(n-1) = sum(n-1), s(n-1) = sum(n-2)

sum(n) = 2*sum(n-1) + s(n-1) = 2*sum(n-1) + sum(n-2)

def

dark2():

dark = [3,9]

for i in range(28):

print(dark)

執行結果:

[3, 9, 21, 51, 123, 297, 717, 1731, 4179, 10089, 24357, 58803, 141963, 342729, 827421, 1997571, 4822563,

11642697, 28107957, 67858611, 163825179, 395508969, 954843117, 2305195203, 5565233523, 13435662249,

32436558021, 78308778291, 189054114603, 456417007497]

網易2017秋 暗黑的字串

題目描述 乙個只包含 a b c 的字串,如果存在某一段長度為3的連續子串中恰好 a b c 各有乙個,那麼這個字串就是純淨的,否則就是暗黑的。例如 baacaaccbaaa連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbccaabb不存在乙個長度為3的連續子串中包含 a ...

網易0912 暗黑字串

題目的大意 乙個字串只能由 a b c 三個字母組合而成 若在字串中如果 a b c 三個字元任意組合出現,則此字串為清澈的,否則為黑暗的。如 aabbccabaa 因為包含 cab 所以是清澈的 aabbccbcbba 則是黑暗的。輸入 字串的長度n 1 n 30 輸出 包含的黑暗字串的個數 樣例...

暗黑字串

題目 乙個只包含 a b c 的字串,如果存在一段長度為3的連續子串中,恰好有 a b c 各有乙個,那麼這個字串就是純淨字串,否則這個字串是暗黑的。例如 baacaaccbaaa這個字串就是暗黑的。例如 baacaaccbaaa這個字串就是純淨的,因為其連續子串中包含了 c b a 各乙個。你的任...