暴力匹配演算法,首尾匹配演算法,KMP演算法

2021-10-06 10:05:22 字數 1678 閱讀 2671

//10170330 容易

#include

#include

#include

#define error 0

#define maxsize 100

using

namespace std;

//串的暴力匹配演算法(brute force)

//該函式的作用是返回子z串t在s中第position個字元之後的位置

//時間複雜度為o(mn),其中m和n分別是文字串和模式串的長度

//當m和n都是10^ 5級別時,用暴力解法完全無法接受

//**如下:

intindex_bf

(char

*s,char

*t,int position)

//s後移一位,同時讓t指向開頭

if(t[n]

=='\0'

)//若t串全部匹配完全

else

return-1

;}//串的首尾匹配演算法

//演算法思想:是對index_bf演算法的一種改進,思想是:若主串與模式串的首字元或尾字元不相同時,則無需再比較其它字元。

//先比較模式串的第乙個字元,再比較模式串的最後乙個字元,最後比較模式串中第二個到第n-1個字元.

intindex_fl

(char

*s,char

*t,int position)

if(j==tlength)

//全部字元相等,返回此時的位置

return i;

else i++

;//有字元不相等,重新執行外層while迴圈}if

(i>=slength-tlength+1)

//若沒有相對應的串,返回error

return error;

return i;

//有相等串時返回i,沒有也返回i,但是此時前面返回了error,注意區分

}//kmp演算法

//kmp演算法最重要的是next陣列

//其中next[i]表示使子串s[0...i]的字首s[0...k]等於字尾s[i-k...i]的最大k

//若找不到相等的前字尾,就令next[i]=-1

//顯然,next[i]就是所求最長相等前字尾中字首最後一位的下標

//getnext求解字串t每個字元的next函式值

void

getnext

(char

*t,int

*next)

}//直到j回退到-1,或是t[i]==t[j+1]

if(t[i]

==t[j+1]

)//如果t[i]==t[j+1]

next[i]

=j;}

}//返回文字串s第position個字元後與模式串t相同的子串的位置

intindex_kmp

(char

*s,char

*t,int position)

else

//不相等,則倒退

if(j==

strlen

(t))

//匹配到相同字串

return

(i-strlen

(t))

;//返回與模式串t相同的子串的位置

}return-1

;}

KMP演算法 1 暴力匹配演算法

假設現在我們面臨這樣乙個問題 有乙個文字串s,和乙個模式串p,現在要查詢p在s中的位置,怎麼查詢呢?如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有 如果當前字元匹配成功 即s i p j 則i j 繼續匹配下乙個字元 如果失配 即s i p j 令i i j...

演算法 字串匹配演算法 暴力匹配演算法 KMP演算法

如果當前字元匹配成功,即 str1 i str2 j 則 i j 繼續匹配下乙個字元 如果當前字元匹配失敗,則 i i j 1 j 0 也就是每次匹配失敗時,i回溯,j被置為0 public static void main string args 暴力匹配演算法 public static int...

演算法 kmp匹配演算法

執行結果 心得收穫 完整 計算next陣列 next陣列的目標是求得從開始到當前位置的字串相同最大前字尾長度為多少 該值的作用是在當前位置的字元匹配失敗時,匹配字串應該從那裡開始繼續匹配,而不用回到開頭 時間複雜的 o m void calnextarray const string str,int...