演算法題 網易程式設計題 暗黑字串組合數

2021-07-22 16:59:10 字數 1873 閱讀 6498

乙個字串僅由』a』,』b』,』c』三個字元組成,若字串中不存在』a』,』b』,』c』三個字元相鄰的子串(比如abc,bac等),則該字串稱為暗黑字串,否則稱為單純字串。

求長度為l的此種字串中有多少種是暗黑字串?

例子:

字串 aabbacca,由於存在bac子串,所以該字串為單純字串。

字串 aabbcc,由於不存在a,b,c相鄰構成的子串,所以該字串為暗黑字串。

長度為1的字串中,暗黑字串總共有3種(即」a」,」b」,」c」),

長度為2的字串中,暗黑字串總共有9種(兩個位置,每個位置有三張可能,3*3=9),

長度為3的字串中,暗黑字串總共有21種(三個位置,每個位置有三種可能,總共有3*3*3=27種,去除純淨字串3!=6,結果為27-6=21種)。

n

desc

expression0無

01a,b,c32

第二位都有三種

3 * 3 = 9

3當兩位相同(相當於只有一位)時,有三種;不同(即其餘情況)時,有兩種

f(1) * 3 + (f(2) - f(1)) * 2 = 9 + 12 = 214同上

f(2) * 3 + (f(3) - f(2)) * 2 = 9 * 3 + 12 * 2 = 51

nf(n) = 3*f(n-2) + 2*(f(n-1) - f(n-2)) = f(n-2) + 2*(f(n-1)

根據公式,遞迴解決。

public

static

intgetnum(int n)

if (n == 1)

if (n == 2)

return getnum(n - 2) + 2 * getnum(n - 1);

}

只要不出現(a、b、c)即可,則每增加一位,要考慮結尾的兩位情況。所以維護乙個hashmap來存放n=2的情況和對應的出現次數,每加一位,累加hashmap中對應的value,最後累加hashmap中所有value值。

注:雖然有3層for迴圈,但是第二層和第三層迴圈次數是常量,由規定的abc決定,第二層是9次,第三層是3次,只是為了避免**塊重複採用的for。

public

static

intgetnum2(int n)

if (n == 1)

if (n == 2)

mapmap = new hashmap<>();

init(map, 1);

for (int i = 0; i <= n - rule.length(); i++) else }}

}map = m;

}int cnt = 0;

for (integer j : map.values())

return cnt;

}private

static

void

init(mapm, int i)

private

static

boolean

isdark(string s)

參考:

/*

* 主要想法:長度為l的暗黑字串可以根據最後兩個字元分成兩類,最後兩個字元是一樣的和最後兩個不一樣的情況。

* 長度為l+1的暗黑字串可以由長度為l的暗黑字串生成。

*/public

static

long

totalcount(long length)

// 長度為length的字串中,暗黑字串總個數

return x1 + y1;

}

Python 網易筆試程式設計題(暗黑字串)

如下是16年網易秋招的筆試程式設計題 乙個只包含 a b 和 c 的字串,如果存在某一段長度為3的連續子串中恰好 a b 和 c 各有乙個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如 baacaaccbaaa 連續子串 cba 中包含了 a b c 各乙個,所以是純淨的字串 aabbcca...

網易0912 暗黑字串

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

演算法題(五十四) 網易2017筆試題 暗黑字串

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