子串查詢;及排列子串分析
今日面試題:子串查
找從一個長字串中查詢包含給定字符集合的最短子串。例如,長串為“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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 糖果;及子串查詢分析
- 子串查詢
- 查詢子串
- 排列子串;及翻譯字串分析字串
- #103. 子串查詢
- 子串查詢函式strstr函式
- Python小技巧 - 子串查詢Python
- BMH子串查詢演算法(PHP實現)演算法PHP
- 子串位置
- 翻譯數字串;及最長迴文子串分析字串
- 最長子串
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 今日面試題:最長迴文子串;及迴文分割分析面試題
- poj3080-kmp+列舉子串 求最長公共子串KMP
- Java 的字串和子串Java字串
- lCS(最長公共子串)
- 04.子串,啟動!
- 子序列與子串問題總結
- java 最長迴文子串Java
- 變數子串的常用操作變數
- 刪除字串中的子串字串
- 76. 最小覆蓋子串
- [leetcode 30 串聯所有單詞的子串 10ms]LeetCode
- Python找回文子串的方法Python
- 雙子串最大異或 題解
- 線性dp:最長公共子串
- POJ 3294 Life Forms(字尾陣列求k個串的最長子串)ORM陣列
- 獲取 url 並解析生成包含查詢串引數的物件物件
- [LeetCode] Substring with Concatenation of All Words 串聯所有單詞的子串LeetCode
- 兩個字串的最長公共子串字串
- c++ : 獲得string的子串C++
- 無重複字元的最長子串字元
- java無重複字元的最長子串Java字元
- 3 無重複字元的最長子串字元
- NOIP2015子串[序列DP]
- 演算法-兩最長迴文子串演算法
- 計算兩個字串最大公有子串字串
- LEECODE 5 求最長迴文子串