字串的模式匹配中的演算法

2021-08-07 18:03:31 字數 2633 閱讀 1187

字串的模式匹配是乙個比較經典的問題:假設有乙個字串s,稱其為主串,然後還有乙個字串t,稱其為子串。

現在要做的是,從主串s當中查詢子串t的位置,如果存在返回位置值,如果不存在返回-1。另外主串又稱為目標串,

子串稱為模式串。

暴力匹配演算法

這是乙個經典的串匹配問題,涉及的演算法也比較多,先討論第一種簡單的暴力演算法,思路如下

將主串s的第pos個字元 與 子串t的第乙個字元比較, 若相同,繼續比較子串和主串後面的字元。

若不相同,那麼從主串s的第(pos + 1)個字元開始繼續向後匹配,直到匹配到主串的(s.len - t.len)的位置為止

匹配成功返回索引值,匹配失敗返回-1,下面是實現**

#include #include 

#define ok 1typedef

intstatus;

typedef

struct

string;

status initstring(string *t)

status strassign(string *t,char *str)

else

t->data[j]='\0'

; t->len=i;

} return

ok;}

int index_******mode(string t,string s,int

pos)

else

} if(j==s.len)return i-s.len;

else

return -1;}

intmain()

設主串s的長度是n  子串t的長度是m

最好的情況是:主串為aaaaaabc, 子串為bc,此時執行的次數是 ( m + n ) / 2 

時間複雜度為o(n+m)

最壞的情況是:主串為000000001,子串為01,此時執行的次數是 m * ( n - m + 2 ) / 2

時間複雜度為o(m*n)

雙向匹配演算法

可以看到上面所示最壞的情況需要不斷回滾,可以限制匹配成功的條件,也就是模式串的首尾同時匹配上

那麼再繼續進行匹配,這個演算法我稱其為雙向匹配演算法,先不管該演算法有沒有很牛的名字,其思路是在暴力

匹配的基礎上加上 模式串的尾部也需要相同才算匹配成功,然後首尾兩頭向中間移動繼續匹配字元,因此如果

模式串的一半長度匹配成功,那麼另一半也就匹配成功,則返回成功匹配的索引值,否則返回-1

#include #include 

#define ok 1typedef

intstatus;

typedef

struct

string;

status initstring(string *t)

status strassign(string *t,char *str)

else

t->data[j]='\0'

; t->len=i;

} return

ok;}

inttwowaymode(string t,string s)

}else

count++;

} printf(

"calc: %d\n

",count);

return -1;}

intmain()

其時間複雜度與暴力匹配的時間複雜度基本相同,但是新的演算法的複雜度更接近於最好的情況也就是o(m + n)

kmp匹配演算法

還有一種改進的演算法是kmp演算法,這個演算法不太好理解

因此這裡找了一篇看過中講的最好的文章:

下面是具體的實現**

#include #include 

#define ok 1typedef

intstatus;

typedef

struct

string;

status initstring(string *t)

status strassign(string *t,char *str)

else

t->data[j]='\0'

; t->len=i;

} return

ok;}

//next陣列演算法

void getnext(string s,int *next)

else

} inti;

}//優化後的next陣列演算法

void newnext(string s,int *next)

else

}}intkmpsearch(string t,string s)

else

c++;

} printf(

"[test]:newnext: %d\n

",c);

if(j==s.len)return i-j;

else

return -1;}

intmain()

通常情況下,模式串的長度n 遠小於 目標串的長度m ,因此kmp的演算法時間複雜度為o(m)

字串的模式匹配演算法

比較的是組成串的字元之間的編碼 unicode ascii 串的邏輯結構和線性表相似,不同之處在於串針對的是字符集 對於基本操作,和線性表有區別 線性表關注單個元素的操作,比如查詢乙個元素,插入刪除操作 串更多的是查詢子串的位置,得到指定位置的子串,替換子串 樸素的模式匹配 不用其他操作 比如字串擷...

BF模式匹配演算法!字串的模式匹配。

problem description 實現串的bf模式匹配演算法,統計在匹配過程中總的字元比較次數,當主串剩餘部分不足子串長度時,停止比較。input 輸入包含兩行,第一行為主串s,第二行為子串t。output 輸出包含兩行,第一行為子串在主串中的位置,如果失配,返回0值 第二行為匹配過程中總的字...

字串模式匹配 簡單的模式匹配演算法

1 簡單的模式匹配演算法 串的模式匹配,是求第乙個字串 模式串 在第二個字串 主串 中的位置。一種簡單的模式匹配演算法 從主串 s 指定的字元開始 一般為第乙個 和模式串 t 的第乙個字元比較,若相等,則繼續逐個比較後續字元,直到 t 中的每個字元依次和 s 中的乙個連續的字串行相等,則 稱匹配成功...