今天是元旦,開篇先祝福你們在新的一年心想事成,工做順利,開心生活每一天 。算法
看到【英雄會】上出現了微軟出的題目:幾個bing,題目內容以下:學習
本屆大賽由微軟必應詞典冠名,必應詞典(Bing Dictionary)是微軟推出的新一代英語學習引擎,裏面收錄了不少咱們常見的單詞,詳情請見:http://cn.bing.com/dict/?form=BDVSP4&mkt=zh-CN&setlang=ZH。但現實生活中,咱們也常常能看到一些毫無規則的字符串,致使詞典沒法正常收錄,不過,咱們是否能夠從無規則的字符串中提取出正規的單詞呢?spa
例若有一個字符串"iinbinbing",截取不一樣位置的字符‘b’、‘i’、‘n’、‘g’組合成單詞"bing"。若從1開始計數的話,則‘b’ ‘i’ ‘n’ ‘g’這4個字母出現的位置分別爲(4,5,6,10) (4,5,9,10),(4,8,9,10)和(7,8,9,10),故總共能夠組合成4個單詞」bing「。.net
我們的問題是:現給定任意字符串,只包含小寫‘b’ ‘i’ ‘n’ ‘g’這4種字母,請問一共能組合成多少個單詞bing?code
字符串長度不超過10000,因爲結果可能比較大,請輸出對10^9 + 7取餘數以後的結果。orm
最初的想法:分別記錄四個字符出現的位置編號,經過後者字符編號大於前者字符編號條件,循環遍歷獲得符合條件的次數,但該算法的時間複雜度O(n4),實現絕對能夠實現,但確定行不通,改變策略。blog
分析:經過題面分析可知,是從字符串中取‘b’、‘i’、‘n’、‘g’四個字符進行排列組合,從新生成字符串」bing」的過程。但注意的是組合在一塊的序列是有必定規律的,序號是逐漸遞增的【(4,5,6,10) (4,5,9,10),(4,8,9,10)和(7,8,9,10)】,這就提供了一個先決條件:後者字符必須在前者字符存在的狀況下進行計數和組合。算法複雜度爲O(n).ci
作法:分別記錄b、bi、bin、bing生成的排列次數,後者次數=前者基礎次數+後者自身次數(例如:bi次數=b次數+bi自身次數)字符串
以字符串"iinbinbing"爲例,對字符串中字符進行遍歷:get
① 分別用四個計數器來記錄組合
b |
bi |
bin |
bing |
0 |
0 |
0 |
0 |
② 當遍歷’i’時,b的計數爲0,在沒有b存在的基礎上,bing是不可能出現的
b |
bi |
bin |
bing |
0 |
0 |
0 |
0 |
③ 當遍歷’i’時,b的計數爲0,在沒有b存在的基礎上,bing是不可能出現的
b |
bi |
bin |
bing |
0 |
0 |
0 |
0 |
④ 當遍歷’b’時,bing是以b開始的,則b計數爲1:
b |
bi |
bin |
bing |
1 |
0 |
0 |
0 |
⑤ 當遍歷’i’時,b的計數爲1,在有b存在的基礎上,bi是能夠出現的,則bi計數爲1(b計數+bi當前計數):
b |
bi |
bin |
bing |
1 |
1 |
0 |
0 |
⑥ 當遍歷’n’時,i的計數爲1,在有bi存在的基礎上,bin是能夠出現的,則bin計數爲1(bi計數+bin計數):
b |
bi |
bin |
bing |
1 |
1 |
1 |
0 |
⑦ 當遍歷’b’時,則b計數爲2:
b |
bi |
bin |
bing |
2 |
1 |
1 |
0 |
⑧ 當遍歷’i’時,b的計數爲2,在有b存在的基礎上,bi可能出現的次數爲3(b計數+bi當前計數):
b |
bi |
bin |
bing |
2 |
3 |
1 |
0 |
⑨ 當遍歷’n’時,i的計數爲2,在有bi存在的基礎上,bi可能出現的次數爲4(bi計數+bin當前計數):
b |
bi |
bin |
bing |
2 |
3 |
4 |
0 |
⑩ 當遍歷’g’時,在有bin存在的基礎上,bing可能出現的次數爲4(bin計數+bing當前計數):
b |
bi |
bin |
bing |
2 |
3 |
4 |
4 |
這樣就獲得了bing字符串的組合方式有4種了,代碼實現以下:
using System; public class Test { public static int howmany(string s) { int bCount = 0; int biCount = 0; int binCount = 0; int bingCount = 0; for (int index = 0, length = s.Length; index < length; index++) { switch (s[index]) { case 'b': bCount = ++bCount % 1000000007; break; case 'i': biCount = biCount % 1000000007 + bCount; break; case 'n': binCount = binCount % 1000000007 + biCount; break; case 'g': bingCount = bingCount % 1000000007 + binCount; break;
} } return bingCount % 1000000007; }
//start 提示:自動閱卷起始惟一標識,請勿刪除或增長。 public static void Main() { Console.WriteLine(howmany("iinbinbing ")); } //end //提示:自動閱卷結束惟一標識,請勿刪除或增長。 }