字串的模式匹配是乙個比較經典的問題:假設有乙個字串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 中的乙個連續的字串行相等,則 稱匹配成功...