以上爲BF算法的實現代碼:BF算法比較「簡單粗暴」,主串每次匹配失敗以後都要往右移動一個單位,字串從新計數,所以其時間複雜度爲O(m*n)。html
BF算法須要注意的是:算法
一、容易混淆下標與位置編程
二、對於數據容量過大的串難以進行匹配。數組
所以引入了KMP算法:學習
優勢:在字串存在有相同的先後綴時,主串不回溯,模式向右滑動1個或多個位置。spa
以下表:.net
(圖片來自http://www.cnblogs.com/yahong/archive/2013/11/13/3420565.html 以及曉梅老師上傳的KMP講解文件)指針
所以KMP須要添加k( k = 「t1..tj-1」先後綴相等字符個數+1):當字串的第j個字符與主串的第i個字符不相等時,i不回溯,j回溯到k,即下一步對si與tk進行比較。code
而next數組存放每個j對應的k。htm
KMP算法的k值分析:
若無相等先後綴:k=1,移動t1至si。
若第一個字符就不匹配,移動t1至si+1。
其中以上分析我認爲纔是弄清楚kj對應關係的重點:
(圖片來自https://www.cnblogs.com/yjiyjige/p/3263858.html)
所以如下解釋便不難理解了:
next[1]=0;
設next[j]=k,則有: 若tk=tj,則 next[j+1]=k+1 不然,k=next[k](next[k]:更小的相等先後綴長度+1),而後考慮新的tk是否等於tj : 若tk=tj,則 next[j+1]=k+1 不然,k=next[k](next[k]:更小的相等先後綴長度+1),而後考慮新的tk是否等於tj :
2、做業的收穫、心得
AI做業題:
此次的做業對我來講挑戰很大,它的難點在於複雜的要求容易讓人造成」想一口吃成大胖子」的編程思路,這實際上是在考驗咱們的接口的編寫能力(我的觀點)。
分析:
一、老師在課堂上對越界的分析填補了我以前寫代碼的漏洞。
char t[3001]; int i=0;int j=0; for(i;isSpace(s[i]);i++)//定位到第一個非空格字符 //此時i已是第一個非空字符的下標 //特殊狀況下全爲空格,i爲'\0'下標 //從i開始輸入 while(s[i]!='\0') { //處理狀況1:單詞間含有連續空格 if(isSpace(s[i]) && isSpace(s[i-1])) { i++; continue; } //越界分析:s[i-1]會不會致使越界? //解釋:由於進入這一步的前提是s至少有一個非空格字符。 //第一次進入該循環時,s[i]不會等於空格,所以不會進行對s[i-1]的判斷,所以不會越界。 //特殊狀況分析:假如s[i]在最末尾的位置,且爲空格 // 解釋: 可在while語句結束後加上: if(t[j-1]==' ')
t[j-1]='\0';
else t[j]='\0';
檢查t的最後一個字符是否空格,是則處理。
二、串和數組的靈活處理
如在定義string t時,容易發生超時等問題。由於string t沒有初始化,因而沒有真正地爲其分配地址。那麼在給t[j]賦值的時候,不會給它分配一個首地址。這就致使直接cout會出錯。有兩個解決辦法,一個是初始化,第二個方法使用for循環遍歷t串,這樣就能順利輸出了,因爲過於麻煩,乾脆放棄用string,直接用字符數組。
char t[3001];//注意輸入所有是I的時候,輸出長度是輸入的三倍 //string t;
(資料分析藉助https://blog.csdn.net/weixin_43314579/article/details/89217510)
3、學習內容總結,目標完成狀況
一、本次做業兩種算法都須要運用圖解和大量模擬計算才能理解,以及題目涉及了多個條件須要考慮如何分紅小接口來實現。
儘管如此,還會有不少小細節使人抓狂,因此,算法和實際代碼之間的搭建橋樑的過程還須要多加熟練。
二、這周每日100行代碼並無實現,而在紙上談兵耗費了不少時間,須要提升本身的畫圖解的能力。
4、下週目標
一、吃透KMP算法,進一步瞭解pta超時的緣由。
二、每日堅持打代碼(打卡提醒本身!!!)