乙個字串僅由』a』,』b』,』c』三個字元組成,若字串中不存在』a』,』b』,』c』三個字元相鄰的子串(比如abc,bac等),則該字串稱為暗黑字串,否則稱為單純字串。
求長度為l的此種字串中有多少種是暗黑字串?
例子:n字串 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種)。
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的連續子串包...