1. 程式人生 > >字串的模式匹配

字串的模式匹配

    字串的模式匹配問題描述如下:若打算在字串T中查詢是否包含子串與字串P相等,則稱字串T為目標,P為模式,並稱這個查詢的過程為串的模式匹配。

    BF模式匹配:這個模式匹配演算法是由Brute和Foece提出的。其基本思想為:

   (1)初始時讓兩字串的起始位置對齊。

   (2)順序比較兩個字串,比較結果有如下三種可能:

            1.匹配成功,則將目標串的比較指標的指向位置減去模式串的長度返回,即為匹配成功的位置。

            2.匹配過程中匹配失敗,則目標串的比較指標指向上次比較的起始位置的下一位,模式串指向模式串的起點。

            3.匹配時發現目標串的剩餘字元長度小於模式串的長度,則匹配失敗。

    假設目標串T為"aaaacxhdsse",模式串P為"aac",這串的模式匹配過程如下:

                                                                0        1        2        3        4        5        6        7        8        9        10        11


 第一趟                                                     a        a        a        a        c        x         h        d        s        s         e

                                                                 a         a       c!


 第二趟                                                     a        a        a        a        c        x         h        d        s        s         e

                                                                           a         a       c!


 第三趟                                                      a        a        a        a       c        x         h        d        s        s         e

                                                                                      a         a       c


      由圖可知,第三趟匹配結束之後,字串的模式匹配完成!!!

BF模式匹配程式碼如下:

#include <iostream>
#include <string>
using namespace std;

int Index(string s, string t){
    int lens = s.length();//計算串s、t的長度
    int lent = t.length();
    int i = 0;
    int j = 0;
    while (i < lens&&j < lent){//如果i、j都各自小於lens和lent
        if (t[j] == s[i]){//如果子串的t[j]和主串的s[i]相等
            ++i;//各自索引都自增
            ++j;
        }
        else{//否則,主串的索引比剛開始後移一個;子串的索引變為0
            i = i - j + 1;
            j = 0;
        }
    }
    if (j == lent){//如果最j和lent的大小一樣,證明找到了,返回子串在主串中的索引
        return i - lent + 1;
    }
    else{//否則返回-1
        return -1;
    }
}

int main(){
    string s,t;
    cin>>s;
    cin>>t;
    int pos = Index(s, t);
    if (pos != -1){
        cout << "find " << t << " at the index " << pos << " of " << s << endl;
    }
    else{
        cout << "can't find " << t << " in " << s << endl;
    }
    return 0;
}