微軟面試100題演算法(1)實現乙個字元匹配

2021-06-22 17:44:33 字數 2195 閱讀 3288

問題:

實現乙個挺高階的字元匹配演算法:

給一串很長字串,要求找到符合要求的字串,例如目的串:123

1******3***2 ,12*****3這些都要找出來

其實就是類似一些和諧系統。。。。。

分析:

這題的真正意思就是,給你乙個目標串,如「123」,只要乙個字串裡面同時包含1、2和3,那麼這個字串就匹配了。系統越和諧,說明錯殺的可能行也就越大。加入目標串的長度為m,模式串的長度為n,我們很容易想到o(mn)的演算法,就是兩遍for迴圈搞定(就是找乙個子串)。那麼有沒有更快的方法呢?

我們考慮問題的時候,如果想時間變得快,有一種方法就叫做「空間換時間」。雜湊表是一種比較複雜的資料結構。由於比較複雜,stl中沒有實現雜湊表,因此需要我們自己實現乙個。但由於本題的特殊性,我們只需要乙個非常簡單的雜湊表就能滿足要求。由於字元(char)是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的下標對應陣列的對應項,而陣列中儲存的0、1對應每個字元是否出現。這樣我們就建立了乙個大小為256,以字元ascii碼為鍵值的雜湊表。(並不僅限於英文本元,所以這裡要考慮256種可能)。

知道了這點,我們可以構建乙個陣列來統計模式串中某個字元是否出現,然後在對目標串進行掃瞄,看看對應的所有位上是否出現,從而判斷是否匹配。分析一下複雜度,大概是o(m+n)。

**如下:

[cpp]

//強大的和諧系統

intis_contain(

char

*src, 

char

*des)  

return

1;    

//匹配成功

}  

與此題類似:給乙個很長的字串str, 還有乙個字符集比如,找出str包含的最短子串,要求o(n)。

[cpp]view plain

copy

/*用兩個變數 front,rear 指向乙個的子串區間的頭和尾(當然,開始時front和rear都指向字串開始處)。

用乙個int cnt[255]=記錄當前這個子串裡字符集a,b,c各自的個數,乙個變數count記錄字符集裡有多少個了

rear 一直加,更新cnt和count的值,直到count等於字符集個數

然後front++,直到cnt裡某個字元個數為0(front 開始的部分有可能和後面的重複,所以front要加到某個字元個數為0),

這樣就找到乙個符合條件的字串了,繼續下去,可以求出所有符合條件的串,同時可以求出滿足條件最短子串

*/#include 

using

namespace

std;  

void

minsubstring( 

char

*src, 

char

*des )  

;  int

cnt[255]=;  

intcnt2[255]=;  

for(

inti=0; i//將字符集裡的字元對映到hashtable陣列中,方便判斷src中的某個字元是否在字符集中

hashtable[*(des+i)]=1;  

intcount=0;  

char

*p=src;  

while

( *(p+rear) !=

'\0'

)    

//開始另乙個串的檢索時,要將count和cnt2清零。cnt不用變

count=0;  

for(i=0; i<255; i++)  

cnt2[i]=0;  

front++;  

break

;                                

}                 

}  front++;  

}  }  

}  else

}//當前字元不在字符集中

rear++;  

}  cout<<"最短子串:"

;  for

(i=minfront ; i<=minrear; i++)  

cout<<*(p+i);  

cout<

}  void

main()    

實現乙個佇列 微軟面試100題 第三十四題

題目要求 實現乙個佇列。佇列的應用場景是 乙個生產者執行緒將int型的數入列,乙個消費者執行緒將int型的數出列。參考資料 程式設計之美1.10 題目分析 可以按照作業系統中的生產者與消費者模型來實現 大致思路如下 void producer void void consumer void 實現 思...

微軟演算法100題35 求乙個矩陣中最大的二維矩陣

35.求乙個矩陣中最大的二維矩陣 元素和最大 如 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是 4 55 3 思路 可以用乙個2x2的二維矩陣從第一行開始依次遍歷直到找到和是最大的那個子矩陣,但暴力破解一般都不是最優答案。我的想法是如果用2x2矩陣逐行遍歷的話,其實每次計算...

微軟演算法面試 24 實現乙個挺高階的字元匹配演算法

題目 給一串很長字串,要求找到符合要求的字串,例如目的串 123 1 32 123這些都要找出來 其實就是類似一些和諧系統。分析 自然匹配就是對待匹配的每個字元挨個匹配 設你的待匹配字串長度位n,模式字串長度位m.對於待匹配字串中的任意乙個字元最壞情況下要匹配m次,也就是說這個字元不在模式字串中。所...