暴力演算法
//暴力演算法
intindex
(sstring s,sstring t,
int pos)
else}if
(j>t[0]
)return i-t[0]
;else
return0;
}
kmp演算法
next陣列的求法:
例子:abaabcac
模式串的下標從1開始
第一位固定為0;
第二位固定為1;
從第三位(i)開始(其餘的每一位都如此),
從該位 (i) 的前一位開始,從右向左尋找子串
從模式串的頭部(最左邊),從左向右尋找子串
找到兩頭子串的最大相同的個數
把最大相同的個數的下一位的索引給next[i]
//next函式演算法
void
get_next
(sstring t,
int next)
else j=next[j];}
}int
index_kmp
(sstring s,sstring t,
int pos)
else j=next[j]
;//模式串向右移動 }if
(j>t[0]
)return i-t[0]
;//匹配成功
else
return0;
}
kmp演算法改進版
例子:abaabcac
求nextval陣列:(需要根據next陣列來求)
1.
void
get_nextval
(sstring t,
int nextval)
else j=nextval[j];}
}int
index_kmp_val
(sstring s,sstring t,
int pos)
else j=nextval[j]
;//模式串向右移動 }if
(j>t[0]
)return i-t[0]
;//匹配成功
else
return0;
}
包含三個演算法的全部程式**
#include
// printf(); scanf()
#include
// exit()
#include
// malloc()
#include
// srand((unsigned)time(null));
#include
// 函式結果狀態**
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
// status是函式的型別,其值是函式結果狀態**
typedef
int status;
// #define elemtype int // 也可以用巨集定義確定elemtype型別
typedef
int elemtype;
// status是函式的型別,其值是函式結果狀態**
-----串的定長順序儲存表示-----
#define maxstrlen 255
// 使用者可在255(1個位元組)以內定義最大串長
typedef
unsigned
char sstring[maxstrlen +1]
;// 0號單元存放串的長度
status strassign
(sstring &t,
char
*chars)
}status strcopy
(sstring &t, sstring s)
intstrcompare
(sstring s, sstring t)
intstrlength
(sstring s)
status strempty
(sstring s)
status concat
(sstring t, sstring s1, sstring s2)
else
if(s1[0]
< maxstrlen)
else
}//concat 演算法 4.2
// 初始條件:串s存在,1≤pos≤strlength(s)且0≤len≤strlength(s)-pos+1。
// 操作結果:用sub返回串s的第pos個字元起長度為len的子串。
status substring
(sstring sub, sstring s,
int pos,
int len)
void
strprint
(sstring t)
//將模式串的next函式值存入到陣列next中
//next函式演算法
void
get_next
(sstring t,
int next)
else j=next[j];}
}//利用模式串t的next函式求t在主串s中第pos個字元之後的位置
//kmp演算法 其中t非空 1<=pos<=strlength(s)
void
get_nextval
(sstring t,
int nextval)
else j=nextval[j];}
}int
index_kmp
(sstring s,sstring t,
int pos)
else j=next[j]
;//模式串向右移動 }if
(j>t[0]
)return i-t[0]
;//匹配成功
else
return0;
}int
index_kmp_val
(sstring s,sstring t,
int pos)
else j=nextval[j]
;//模式串向右移動 }if
(j>t[0]
)return i-t[0]
;//匹配成功
else
return0;
}//暴力演算法
intindex
(sstring s,sstring t,
int pos)
else}if
(j>t[0]
)return i-t[0]
;else
return0;
}int
main()
printf
("輸入字串t(模式串):");
scanf
("%s"
,c);if(
!strassign
(t, c)
)// strprint(s);
// strprint(t);
printf
("輸入要在主串開始的位置pos:");
scanf
("%d"
,&pos)
;printf
("選擇要是用的演算法1(暴力演算法)/2(kmp演算法next)/3(kmp演算法nextval):");
scanf
("%d"
,&x);if
(x==1)
else
if(x==2)
printf
("\n");
number=
index_kmp
(s,t,pos)
;printf
("%d"
,number);}
else
if(x==3)
printf
("\n");
number=
index_kmp_val
(s,t,pos)
;printf
("%d"
,number);}
return0;
}
資料結構 模式匹配 KMP演算法
模式匹配 在主串中找到與模式串相同的子串,並返回其位置 在討論kmp時,先來看看樸素模式匹配有什麼問題。樸素模式匹配的思路是把主串中與模式串長度相同的所有子串搞出來,挨個與模式串對比,有乙個字元不匹配時,立即放棄當前子串,轉而索引下乙個子串。在最壞的情況中,主串指標向前走m步,回退m 1步 前m 1...
資料結構 模式匹配演算法
模式匹配 子串的定位操作。模式匹配演算法主要有 1 樸素的模式匹配演算法 2 kmp模式匹配演算法 next陣列 3 改進的kmp模式匹配演算法 nextval陣列 比較 1,時間複雜度 樸素的模式匹配演算法為o n m 1 m 效率很差,kmp演算法為o m n 大大避免重複遍歷情況。2,改進的k...
資料結構 串 串的模式匹配 KMP演算法
head.h include includeusing namespace std class string void string getstring void string getsubstring void string kmp cout kmp method called main.cpp ...