子串查詢;及排列子串分析
今日面試題:子串查
找從一個長字串中查詢包含給定字符集合的最短子串。例如,長串為“aaaaaaaaaacbebbbbbdddddddcccccc”,字符集為{abcd},那麼最短子串是“acbebbbbbd”。如果將條件改為“包含且只包含給定字符集合”,你的演算法和實現又將如何改動。
========================================================
排列子串分析
原題
給定兩個字串A和B,判斷A中是否包含由B中字元重新排列成的新字串。例如:A=abcdef, B=ba,結果應該返回true。因為ba的排列ab,是A的子串。
分析我們假設A字串的長度為m,B字串的長度為n。首先,如果B的長度大於A了,則肯定返回的是false。所以,我們下面的討論都是m>=n的情況。
最直接的,我們可以計算出B的所有排列字串,然後逐個去A中匹配。B的所有排列字串有n!個,每一個匹配,複雜度較高。
那麼如何改進呢?是否可以減少匹配的次數呢?我們首先對B進行排序,採用快排,時間複雜度O(nlogn),得到D。然後在A中,從頭開始,長度為 n的子串進C行排序,然後判斷與C與D是否相同。在A中,一共有m-n+1個長度為n的子串,每一個子串進行排序,時間複雜度為O(nlogn),總的時 間複雜度為O((m-n+1)nlogn),O(mnlogn)。但其實,在A中,只有第一個C的排序時O(nlogn)的,其他的都是去掉第一個字元, 然後插入下一個字元,排序時間複雜度為O(n),這樣整體的時間複雜度為O(mn)。下面舉個例子: 設定A=fedcba, B=ab,則m=6,n=2
1. 排序B,D=ab
2. 在A中,第一個長度為2的子串C=fe,排序之後為ef,與D不匹配,則從C中刪除第一個字元f,加入下一個字元c,此時C=ec。再重複排序的過程。直到A遍歷完畢。
明顯第一個C需要快排,其他的只需要插入即可。
還有其他的方法,可以用hashmap儲存B中的字元,和A中的每一個長度為n的字串進行判斷是否匹配。
【分析完畢】
本文來自微信:待字閨中,2013-09-30釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 子串查詢
- Python小技巧 - 子串查詢Python
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 子串位置
- 30串聯所有單詞的子串
- 最長子串
- 最長上升子串
- 子串匹配 BF法
- HDU 1671 字典樹(判斷是否有一個串是另一個串的子串)。
- [leetcode 30 串聯所有單詞的子串 10ms]LeetCode
- lCS(最長公共子串)
- 04.子串,啟動!
- [NOIP2015 提高組] 子串
- 76. 最小覆蓋子串
- Python找回文子串的方法Python
- java 最長迴文子串Java
- 獲取 url 並解析生成包含查詢串引數的物件物件
- 線性dp:最長公共子串
- 雙子串最大異或 題解
- DreamJudge-1294-字尾子串排序排序
- 5. 最長迴文子串
- LeetCode 5.最長迴文子串LeetCode
- 無重複字元的最長子串字元
- 最長迴文子串 -- 三種解答
- 演算法-兩最長迴文子串演算法
- LeetCode-5. 最長迴文子串(Manacher)LeetCode
- Leetcode[字串] 5. 最長迴文子串LeetCode字串
- 3 無重複字元的最長子串字元
- LeetCode——無重複字元的最長子串LeetCode字元
- 每日一算--最長迴文子串
- 76.最小覆蓋子串 Golang實現Golang
- java無重複字元的最長子串Java字元
- leetcode 之無重複字元的最長子串LeetCode字元
- [動態規劃] 六、最長迴文子串動態規劃
- 回溯演算法 LeetCode 131 分割回文子串演算法LeetCode
- 演算法之字串——最長迴文子串演算法字串
- 滑動視窗法——子串相關問題
- 【LeetCode】3 無重複字元的最長子串LeetCode字元
- Q13 LeetCode76 最小覆蓋子串LeetCode