字符串匹配處理

我先拋磚引玉寫幾個topic,而後我會指定大家中的一些領域專家分享本身的知識,固然也歡迎大家毛遂自薦。html

  1. 將一個string轉換爲int

這是我之前愛用的面試題,即便不考慮科學計數法和其它進制,短期寫出正確程序仍然不易(須要考慮溢出)面試

  1. 字符串左旋:好比abcde向左旋轉三位變成deabc
  2. 假設客戶端和服務器之間的通訊是不安全的(傳遞的全部數據均可能被非法得到,對稱加密算法可能被破解)

設計安全機制,在服務正經常使用戶的同時,拒絕非法訪問算法

  1. 隨機生成m個整數,要求

a)         每一個數出現的機率均等數組

b)         它們在1到n之間安全

c)         它們各不相同服務器

d)         效率較高ide

  1. 給定一個包含n 個整數的數組,找出其中出現超過一次的數

這5道題若是你能不借助任何外力,作出4道,請來找我。加密

進入正題:url

字符串處理在工做中常常遇到,最有名的算法就是kmp。可是,它有幾個缺點:spa

1. 只能單字符串;

2. 須要預處理;

3. 其實,它的速度不是最快的……出名只是由於在教材中;

4. 不能處理最長公共子串等其它非匹配問題。

 

事實上,字符串處理博大精深:

  1. 單字符串匹配

在長度爲n的匹配串中查找長度爲m的模式串是否出現,以及出現的位置

a)         Brute Force

從左到右一個字符一個字符比較

時間複雜度O(n*m)

b)         KMP

最有名的算法,教科書中,做者之一(K)是圖靈獎得主

核心思想是,充分利用m的特性,匹配失敗時,儘量多地移動模式串,以減小比較次數

時間複雜度O(n)

http://jpkc.nwu.edu.cn/datastr/study_online/newsite/pluspage/kmp.htm

c)         Horspool

從右到左比較

當匹配失敗時,模式串從不匹配字符處向左尋找匹配串中不匹配的字符,若找到取最靠右的那個,移動模式串對齊;若找不到,移動模式串到不匹配字符處右方

時間複雜度平均O(n),最壞O(n*m)

http://www.cnblogs.com/dsky/archive/2012/04/24/2467655.html

d)         BM

這個算法的實際效果比KMP快數倍;是邏輯上最複雜的算法

至關於KMP和Horspool的結合

時間複雜度O(n)

http://blog.csdn.net/iJuliet/article/details/4200771

e)         Sunday

這是我我的最喜歡的算法,比BM快,同時很簡潔

其它和Horspool相似,只是比較的不是不匹配的字符,而是匹配串中下一位字符

http://baike.baidu.com/view/6325831.htm?fr=aladdin

f)          Rabin-Karp

以串而不是字符爲單位,串映射爲值;值同樣再繼續比較

http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm

  1. 多字符串匹配

在不少匹配串(字典)中查找長度爲m的模式串

a)         Trie

我我的比較喜歡的一種算法,普遍應用於tips(搜索提示)、禁詞過濾等

http://zh.wikipedia.org/zh/Trie

b)         Aho–Corasick

有限狀態自動機+KMP

http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm

  1. 後綴數組

後綴數組是字符處理的利器,普遍應用於求最長前綴、最長公共子串、最長遞增子串、最長迴文子串和最長重複子串等。

若是參加ACM,此技能必須掌握。

http://baike.baidu.com/view/1240197.htm?fr=aladdin

http://wenku.baidu.com/link?url=Qho60zwH165gwPqq0Eubjvv7k9d0uv9J8NX8tzUi5B7Fechm0LJtS3JPJN8syCLfoXdWjhEi71SVYe661idevKMqnOX_X-akYhXq59e5GLS

相關文章
相關標籤/搜索