子串的定位操作通常稱做串的模式匹配
假設現在我們面臨這樣乙個問題:有乙個文字串s,和乙個模式串p,現在要查詢p在s中的位置,怎麼查詢呢?
如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有:
//假設文字串s和模式串p的長度存在s[0]與p[0]中
//下標從[1]開始,這點要注意
intindex
(char
* s,
char
* p,
int pos)
else
//指標後退,重新開始匹配
}//匹配成功,返回模式串p在文字串s中的位置,否則返回-1
if(j > p[0]
)//遍歷完模式串,匹配
假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置
讓i值不回溯,j值回溯多少取決於模式串p當前字元之前的串的前字尾的相似度
int
kmpsearch
(char
* s,
char
* p,
int pos)
else
//指標後退重新開始匹配}if
模式串pab
abaa
aba最大長度值(包含自己)00
1231
123next(不包含自己)(下標從0開始)-10
0123
112next(不包含自己)(下標從1開始)01
當中的2、3、4、5步驟,其實都是多餘的判斷。由於p串的第
二、三、四、五位置的字元都與首位的"a"相等,那麼可以用首位next[1]的值去取代與它相等的字元後續next[j]的值,這是個很好的辦法。
//優化過後的next 陣列求法
void
getnextval
(char
* p,
int next)
else
}}
j12
3456
789模式串pab
abaa
aba最大長度值(包含自己)00
1231
123next(不包含自己)(下標從0開始)-10
0123
112next(不包含自己)(下標從1開始)01
1234
223改進的next值01
0104
210如果某字元a的next值指向的字元b=這個字元a,則將b的next賦值給a的next值
如果a位字元與它next值指向的b位字元相等,則該a位的nextval就指向b位的nextval值,如果不等,則該a位的nextval值就是它自己a位的next值。
一文詳解TCP協議
osi層 功能tcp ip協議 應用層文字傳輸,電子郵件,檔案服務,虛擬終端 ftp,http,snmp,dns等 表示層 資料格式化,轉換,資料加密 沒有協議 會話層 解除或建立與其他節點的聯絡 沒有協議 傳輸層提供端對端的介面 tcp,udp 網路層為資料報選擇路由 ip,icmp,rip,os...
一文詳解 I O 優化
在沒有 dma 技術之前,i o過程是這樣的 cpu 發出對應的指令給磁碟控制器,飯後返回。磁碟控制器收到指令後,於是就開始準備資料,會把資料放入到磁碟控制器的內部緩衝區中,然後產生乙個中斷。cpu 收到中斷訊號後,停下手頭的工作,接著把磁碟控制器的緩衝區的資料一次乙個位元組地讀進自己的暫存器,然後...
一文詳解scp命令
加密的方式在本地主機和遠端主機之間複製檔案 scp命令用於在linux下進行遠端拷貝檔案的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為唯讀read only system時,用scp可以幫你把檔案移出來。另外,...