Blog.3 | string:BMP、BF

int Index_BF(sstring s, sstring t, int pos)
{
 //其中,t非空,1≤pos≤StrLength(s)
 int i,j;
    i = pos-1; //下標
 j = 0; //下標
    while(i<s.length && j<t.length){
       if(s.ch[i]==t.ch[j]){++i; ++j;} //繼續比較後繼字符
       else{i=i-j+1; j=0;} //指針後退從新開始匹配
   }  
   if(j==t.length) return i-t.length+1; //模式串所有讀完,表示匹配,返回開始匹配位置的下標
   else return 0;  
}
 

以上爲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超時的緣由。

二、每日堅持打代碼(打卡提醒本身!!!)

相關文章
相關標籤/搜索