數據結構:BF算法


貼上源代碼:

#include<iostream>
using namespace std;
int BF(char S[],char T[])
{
    int i,j;
    i = j = 0;
    while(S[i]!='\0'&&T[j]!='\0'){
        if(S[i]==T[i]){
            i++;
            j++;
        }
        else{
            j = 0;
            i = i-j+1;
        }
    }
    if(T[j]=='\0')
        return i -j+1;
    else
        return 0;
}

int main()
{
    //BF
    cout<<BF("abcabcccc","abc");

    return 0;
}


這是一種低效的模式匹配算法。叫做BF算法。
主要思想十分簡單:

  • 給出兩個字符串,分別為主串S和子串T,記下標為i,j。分別從第一個字符開始比較(即i=j=0)。當S[i]T[j]時,繼續比較下一個;當S[i]!=T[j]時,j=0(重新從頭開始比較子串),i的值賦為i-j+1。(關於為什么,我們接下來說)。如果S[i]'\0'了,證明主串比較完畢了,但是沒有找到匹配的,即S不含有T,那么返回0;如果T[j]=='\0'了,證明子串比較完畢了,也就是主串S中含有子串T。此時返回子串T在主串S中出現的第一個字符的位置,即返回i-j+1

圖示如下:
畫圖的時候兩個串的最后都有‘\0’!!!!因為字符串的最后一位不是‘\0’么 但是我一個不小心忘了畫了 也懶得改圖了。。你們知道就行。。。。





此時S[i]!=T[j]
進行“回溯”。
子串從頭開始比較,主串往后挪一位開始比較。

此時還是S[i]!=T[j]
進行“回溯”。
子串從頭開始比較,主串往后挪一位開始比較

以此類推。。。。
即,

        if(S[i]==T[i]){
            i++;
            j++;
        }
        else{
            j = 0;
            i = i-j+1;
        }

其中,i-j+1算的是i開頭在的位置和j開頭在的位置的差(即使i和j代表的字符相等時,同時++,也不會改變這個差)。再加上1就是再往后移一位。

依靠String實現的BF算法 C++


int BFstring(string MotherStr, string SonStr){
    int i = 0, j = 0;
    for(;(i != MotherStr.size()) && (j != SonStr.size());){
        if(MotherStr[i] == SonStr[j]){
            i++, j++;
        }
        else{
            i = i - j + 1;
            j = 0;
        }
        if(j == SonStr.size()){
            return i - j + 1;
        }

    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM