字串匹配

2021-07-14 11:31:02 字數 1938 閱讀 2778

描述:給定乙個正在編輯的文字s以及乙個模式字串p,判斷p是否在s中出現,並返回p在s中的位置。

思路一:樸素演算法,分別在s和p中設定指標指向第乙個字元,若當前字元相同,則迭代比較後面字元;若不匹配,則令s的工作指標前移一位,指向p的指標從頭迭代字元是否匹配。如圖:

令當前cur指向a,依次迭代比較s,p後續元素。

找到b,c不匹配後,令當前cur後移,p從頭迭代比較如圖:

b,a不匹配,令cur後移,p從頭迭代比較如圖:

判斷是否比較結束模式p最後乙個元素,若是,則返回當前cur為模式p在s出現的位置。

class solution

if(*re=='\0')return null;

while(*re)

if(*p=='\0')return cur;

else

}return null;}};

思路二:kmp演算法

kmp演算法是對樸素演算法的改進,將時間從平方級降低到線性。kmp演算法需要用到輔助陣列next[m],長度與模式p一致。陣列next求解如下:

當模式p為a  b  a  c

next[0]為模式p只有前乙個元素的子串的字首與字尾的最長公共長度,為0;

next[1]為模式p有前兩個元素的子串的字首與字尾的最長公共長度,為0;

next[2]為模式p有前三個元素的子串的字首與字尾的最長公共長度,為1;

next[3]為模式p有前四個元素子串的字首與字尾的最長公共長度,為0;

因此next陣列為0  0  1  0

為什麼要計算每乙個子串前字尾的最長公共長度呢?這是因為樸素演算法中,當出現不匹配的情況時,我們只將cur前移一位。但是實際上當前位不匹配時,之前的元素都能夠和模式p對應,因此我們向前移動的位數不再為1,而是移動位數 = 已匹配的字元數 - next[i],i為最後乙個匹配的字元在模式p中的位置。

a  b  a  b  a  c

a  b  a  c

此時,b,c不對應,但是前面元素均一一匹配,a為最後乙個匹配字元next[2]=1,移動位數 = 已匹配的字元數 - next[i]=3-1=2。因此將向前移動兩位

a  b  a  b  a  c

a  b  a  c

next求解思路:

1.當子串只有乙個元素時,next[i]=0;

2.當next[i-1]==0時,我們只需要比較最後乙個元素與第乙個元素是否相等,如next[1]=0,我們比較最後乙個元素a與第乙個元素a,相等則next[2]=1.

3.依次類推,當next[i-1]==j時,我們比較最後乙個元素與第(j+1)個元素是否相等,如next[2]=1,此時我們比較最後乙個元素c與第二個元素b,不相等,則比較最後乙個元素與第乙個元素a,不相等,則next[3]=0;,若最後乙個元素為b,則next[3]=j+1=1+1=2。

void computenext(const char *pa,int next)

}

kmp**如下:

class solution

if(*p=='\0')return cur;

else

}return null;

}private:

void computenext(const char pa,int next) }

};

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...

字串匹配

time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...

字串匹配

面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...