【英雄會】微軟題目:幾個bing

今天是元旦,開篇先祝福你們在新的一年心想事成,工做順利,開心生活每一天大笑算法

看到【英雄會】上出現了微軟出的題目:幾個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 //提示:自動閱卷結束惟一標識,請勿刪除或增長。 }
相關文章
相關標籤/搜索