知識點:
1.串:
關於串的學習,我最大的收獲是理解了KMP算法(解決串的模式匹配問題)和了解了Manacher算法(解決求字符串最長回文問題)。
在這一過程中,我常驚嘆算法的巧妙,感慨前人的智慧結晶,以下是我對這兩種算法的理解:
(1)KMP算法:
這里就不貼代碼了,就說說它的實現原理。具體可以看這里利用KMP算法解決串的模式匹配問題(c++) -- 數據結構
主串和模式串匹配到某一個位置發現 主串中1的部分和模式串中2部分不匹配時,
模式串就會移動一定的位置,如下圖:
那么我們該移動多少呢?
我們繼續往下看,上下這兩個字符串分別是原來模式串的位置,和移動后模式串的位置。
能夠這樣移動的前提是保證 A == B,原來的匹配點截至到了1和2(即d)部分,
模式串移動之后匹配點就變成了1和c部分的比較。
為了能夠實現KMP算法中模式串的移動,需要引入一個next[ ]數組。
next[ ] 存放已匹配子串中最長前后綴長度
以紅色部分c為例子:
已匹配的子串:abaab → 最長前后綴ab 長度為2
KMP算法應用:PowerString問題(求字符串的最小周期)
(2)Manacher算法(馬拉車算法):
2.數組:
至於數組的學習,最大的收獲和成就就是理解了十字鏈表的原理和操作過程,並成功將以實現。
以下博客已經寫得挺詳細的了,就不再重復聲明:
編程時遇到的困難:
1.利用KMP算法解決串的模式匹配問題(c++) -- 數據結構
總結及學習心得:
在作業和實踐的題目中,我都選擇了相對來說困難的完成方式,這對我來說是一種得到鍛煉和學習的最好方式。
縱使過程很痛苦,熬了大半個星期的夜,幸運的是結果還算是差強人意。
目標:
保持當前的學習熱情,高要求嚴格自己,學習更多更巧妙的算法。