題目: 給一個很長字符串,要求找到符合要求的字符串,例如目的串123,1***3***2,12****3這些都要找出來spa
解: 這題的意思是,例如給定目的串S="abc",那麼在這個很長的字符串中尋找子字符串,這個子字符串中知足S中的每一個字符都要出現,而且S中的某一個字符只出現1次。.net
設待匹配字串長度位n,模式字符串長度位mblog
1。對待匹配字符串的每個字符進行m次匹配,記錄下S中每一個字符出現個數,當個數都>=1時結束,此時是知足條件的1個子字符串,而後從這個子字符串的下一個字符開始匹配字符串
時間是O(m*n)get
2.hash的方法。對目的串hash,遍歷待匹配字符串,對每一個字符hash,若某個子字符串知足目的串的每一個字符hash值都出現就是hash
3。變量
與此題相相似:
就是給一個很長的字符串str 還有一個字符集好比{a,b,c} 找出str裏包含{a,b,c}的最短子串。
要求O(n)?
好比,字符集是a,b,c,字符串是abdcaabcx,則最短子串爲abc。遍歷
用兩個變量 front rear 指向一個的子串區間的頭和尾
用一個int cnt[255]={0}記錄當前這個子串裏 字符集a,b,c 各自的個數,
一個變量sum記錄字符集裏有多少個了方法
rear 一直加,更新cnt[]和sum的值,直到 sum等於字符集個數
而後front++,直到cnt[]裏某個字符個數爲0,這樣就找到一個符合條件的字串了時間
繼續前面的操做,就能夠找到最短的了。