KMP模板與講解

?

讀書筆記終于寫完了,寫一下我對KMP的理解。

KMP的思想就是盡量利用已經得到的信息,來降低時間復雜度,已經得到的信息存放在next數組里。算法確實很難理解,所以很難講解。。舉個例子來說吧。

設字符串是str[],next[5] = 2。

就表示str[5]前面的2個字符,與str[2]前面的2個字符相同,也就是str[0] == str[3], str[1] == str[4],這樣把str[2]平移到str[5]的位置以后,就能保證前面的已經匹配了。就是下圖:

目標串 ? ?..........a ?b ?c.........

str[] ? a ?b ?c ?a ?b ?d ?e ?f

下標 ? ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7

這時候在下標為5的位置,d和c是不匹配的,因為next[5] = 2,所以把下標為2的c平移到下標為5的位置,再次比較。

目標串 ? ?..........a ?b ?c.........

?? ? ? ? ? ?str[] ? ? ? ? ? ? ?a ?b ?c ?a ?b ?d ?e ?f

下標 ? ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7

當下標超出待匹配的字符串的長度時,就說明在目標串中找到了該字串。

這里還有一個定理:next數組中的值就是"前綴"和"后綴"的最長的共有元素的長度。

還有一句“名言”:假如你要向你喜歡的人表白的話,我的名字是你的告白語中的子串嗎?

最后是幾篇比較好的講解KMP的文章,講解方式各不相同,但是都講得特別好。

http://www.matrix67.com/blog/archives/115

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

http://blog.csdn.net/v_july_v/article/details/7041827

 1 void kmp(char target[], char source[])
 2 {
 3     int n = strlen(target);
 4     int m = strlen(source);
 5     int *next = new int[m];
 6     int j = -1;
 7     next[0] = -1;
 8     for(int i = 1; i < m; i++)
 9     {
10         while(j >= 0 && source[j+1] != source[i])
11             j = next[j];
12         if(source[j+1] == source[i])
13             j++;
14         next[i] = j;
15     }
16     j = -1;
17     for(int i = 0; i < n; i++)
18     {
19         while(j >= 0 && source[j+1] != target[i])
20             j = next[j];
21         if(source[j+1] == target[i])
22             j++;
23         if(j >= m-1)
24         {
25             printf("%d\n", i-m+1);
26             j = next[j]; //繼續查找更多
27             //return;   //不再繼續查找
28         }
29     }
30 }
View Code

?

轉載于:https://www.cnblogs.com/wolfred7464/p/3414993.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259193.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 非root app 捕捉系統廣播_APP的生死之道

這篇文章主要介紹APP在安卓系統中是怎么被殺死的&#xff0c;按照怎樣的一個策略去釋放進程&#xff1b;同時介紹一些延長應用存活時間的方案&#xff0c;雖然這個在現在安卓系統上越來越難實現了&#xff0c;但是也是可以稍微了解下&#xff0c;主要也是通過這些hack的方案更好…

C++11系列學習之六-----for

前言C11這次的更新帶來了令很多C程序員期待已久的for range循環&#xff0c;每次看到javascript&#xff0c; lua里的for range&#xff0c;心想要是C能有多好&#xff0c;心里別提多酸了。這次C11不負眾望&#xff0c;再也不用羨慕別家人的for range了。使用場景ex1&#xff1…

ArcGIS Engine 10開發環境的一些常見問題(轉載)

轉自&#xff1a;http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid107612&extra&page1 許多版友在剛剛使用ArcGIS 10做開發的時候&#xff0c;都會遇到這樣那樣的問題。在擔任實習版主的這一個多月里&#xff0c;看到了這么幾個與開發環境相關的問題&#xff0c;重…

@value 靜態變量_面試官:為什么靜態方法不能調用非靜態方法和變量?

這個可能很多人之前學習jvm的時候都會遇到&#xff0c;屬于一個小問題&#xff0c;寫這篇文章的原因是我在看java相關的面試題目中遇到的&#xff0c;因此順手總結一下&#xff1a;一、例子我們先看效果&#xff1a;我們在靜態方法main中調用非靜態變量或者是方法都會報錯。我們…

SpringMVC連接多數據源配置

在spring-config-datasource.xml中配置&#xff1a; <ds:ibatis-config><ds:sql-map-clientid"sqlMapClient2"datasource-ref"riskBasicDataSource2"config-location"classpath:sqlmap-config.xml"/> </ds:ibatis-config> <…

Memcached 工作原理

http://hzp.iteye.com/blog/1872664Memcached處理的原子是每一個&#xff08;key&#xff0c;value&#xff09;對&#xff08;以下簡稱kv對&#xff09;&#xff0c;key會通過一個hash算法轉化成hash-key&#xff0c;便于查找、對比以及做到盡可能的散列。同時&#xff0c;mem…

C++11系列學習之七---------初始化列表

一、前言C的學習中&#xff0c;我想每個人都被變量定義和申明折磨過&#xff0c;比如我在大學筆試過的幾家公司&#xff0c;都考察了const和變量&#xff0c;類型的不同排列組合&#xff0c;讓你區別有啥不同。反正在學習C過程中已經被折磨慣了&#xff0c;今天再來看看重溫下那…

c# streamReader轉XmlDocument讀取節點

http獲得web&#xff08;url&#xff09;請求&#xff0c;先是獲得數據流streamreader&#xff0c;之后將String數據流轉換為xmldocument&#xff0c;之后xmlnode讀取節點。 // get the responseWebResponse webResponse webRequest.GetResponse();if (webResponse null){ re…

ad中電容用什么封裝_用什么來降低噪聲?只要幾個電容器就可以,簡單有效!...

使用電容器降低噪聲噪聲分很多種&#xff0c;性質也是多種多樣的。所以&#xff0c;噪聲對策(即降低噪聲的方法)也多種多樣。在這里主要談開關電源相關的噪聲&#xff0c;因此&#xff0c;請理解為DC電壓中電壓電平較低、頻率較高的噪聲。另外&#xff0c;除電容外&#xff0c;…

C#委托的介紹(delegate、Action、Func、predicate)

委托是一個類&#xff0c;它定義了方法的類型&#xff0c;使得可以將方法當作另一個方法的參數來進行傳遞。事件是一種特殊的委托。 1.委托的聲明 (1). delegate delegate我們常用到的一種聲明 Delegate至少0個參數&#xff0c;至多32個參數&#xff0c;可以無返回值&#xff0…

版本1.8.1Go安裝以及語法高亮配置

注意點&#xff1a;普通用戶和root用戶高亮要設置兩遍①下載go安裝包 https://golang.org/doc/ 最新的版本&#xff1a;go1.8.1.linux-amd64.tar.gz ②進入主目錄&#xff1a;$:su ~賦給普通用戶root權限&#xff0c;以便執行tar命令&#xff1a;$:su root 把壓縮包解壓到/usr/…

求二叉樹中節點的最大距離

struct node{ Node Left; Node Right; int MaxLeft;//左子樹到該節點的最長距離 int MaxRight;//右子樹到該節點的最長距離 char chValue; }; void FindMaxLen(Node T) { int tmpMax 0; if (NULL T) { return; } if (NULL T->Left) { T->MaxLeft 0; } if (NULL T-&g…

flutter 自定義鍵盤_入門級機械鍵盤選購對比

個人覺得鍵盤這種東西&#xff0c;手感是最重要的&#xff0c;畢竟鍵盤是要拿用的&#xff0c;不是拿來供的。不管鍵盤再怎么好看、酷炫&#xff0c;只要你用起來不舒服、不習慣&#xff0c;那對你而言&#xff0c;就不會是一把好鍵盤。那么&#xff0c;影響手感的因素主要有哪…

騰訊2016校招試題----------格雷碼的實現

問題&#xff1a;產生n位元的所有格雷碼。格雷碼(Gray Code)是一個數列集合&#xff0c;每個數使用二進位來表示&#xff0c;假設使用n位元來表示每個數字&#xff0c;任兩個數之間只有一個位元值不同。例如以下為3位元的格雷碼&#xff1a; 000 001 011 010 110 111 101 100 。…

關于A/D方面的小結

&#xff08;轉載&#xff09;AD精度與分辨率 最近做了一塊板子&#xff0c;當然考慮到元器件的選型了&#xff0c;由于指標中要求精度比較高&#xff0c;所以對于AD的選型很慎重。 很多人對于精度和分辨率的概念不清楚&#xff0c;這里我做一下總結&#xff0c;希望大家不要…

常用表的字段

F:\study\表的設計 一&#xff1a;網站設置有哪些內容&#xff1a; 1>title 表題 2>logo 3>keyword 關鍵字 4>status 是否開啟 5>Internet 備案號 6>url 網址 7>tel 聯系電話 8>brief …

四個好看的CSS樣式表格

1. 單像素邊框CSS表格 這是一個非經常常使用的表格樣式。 源碼&#xff1a; <!-- CSS goes in the document HEAD or added to your external stylesheet --> <style type"text/css"> table.gridtable { font-family: verdana,arial,sans-serif; font-si…

C# COM ArcgisEngine 多線程相關

這段時間做ArcgisEngine&#xff0c;因為在做圖形交叉分析時&#xff0c;計算數據分多個線程分別計算不同的圖形&#xff0c;發現計算錯誤。后來初步了接了是由于所有的ArcObjects組件都被標記為單線程單元&#xff08;STA參考VS幫助文檔&#xff09;。每個STA都限制在一個線程…

loading initial ramdisk 卡住_驛站晨讀 | 一城市多家快遞“卡住了”!有快遞網點直接建議:換別家吧......

編輯&#xff1a;驛站老鬼 主播&#xff1a;若晨?▎美團回應“外賣小哥致電取餐被打成顱腦損傷”10月15日晚&#xff0c;成都溫江區某小區內發生一起顧客毆打外賣員事件&#xff0c;導致外賣員馮某東輕度顱腦損傷以及右膝外側半月板撕裂。據了解&#xff0c;事件起因是顧客要…

CVTE2016校招試題摘選

今年的題分兩部分&#xff0c;時間為晚上7:00-9:30,題目分不定項選擇與兩道編程題。 下面是我自己抄下來的一部分題&#xff0c;盡饗讀者。 1.堆排序屬于下面哪種排序方法&#xff1f; A、選擇排序 B、插入排序、C、交換排序 D、歸并排序 答案&#xff1a; A 2. 用RSA算法…