1:思路:從主串s=「s0s1s2s3…sn-1」的第乙個字元開始與子串t="t0t1t2…tm-1"的第個字元進行比較, 若相等,則繼續比較後續字元; 否則從主串s的第-個字元開始重新與子串t的第乙個字元進行比較,若相等,則繼續比較後續字元;否則從主串s的第三個字元開始重新與子串t的第乙個字元進行比較;如此不斷進行比較,若存在子串t中的每個字元依次和主串s中的乙個連續字串行相等,則匹配成功,函式返回子串1的第乙個字元在主串、中的下標,若比較完主串s的所有字串行後,不存在一乙個 和模式串t相等的子串,則匹配失敗,函式返回-1。
2:一般形式:
3:**實現
int
bfindex
(dstring s,
int start, dstring t)
//brute-force演算法
else}if
(j == t.length)
else
return v;
}
總結:這種方法太消耗時間了。
思路:這個演算法分兩步,①先算next陣列②再用kmp演算法。
一:模式串的next:next[0]=-1;(這個是不可能出現的情況)
next[1]=0;(在1前面的數中的最大真子串)
因為t0!=t1,next[2]=0;
因為t0!=t2,next[3]=0;
因為t0=t3=『a』,next[4]=1;
因為t1=t4=『b』,既有t0t1=t3t4=』『ab』』,next[5]=next[4]+1=2;
因為t2=t5=『c』,既有t0t1t2=t3t4t5=』『abc』』,next[6]=next[5]+1=3;
因為t3=t6=『a』,既有t0t1t2t3=t3t4t5t6=』『abca』』,next[7]=next[4]+1=4;
因為t4!=t7,k=next[k]=next[4]=1;有因為t1!=t7,k=next[k]=next[1]=0;再因為t0=t7=『a』,next[8]=next[1]+1=1
//模式串頭
else
}}二:kmp演算法(在bf演算法的基礎上進行了小小的改進)
int
kmpindex
(dstring s,
int start, dstring t,
int next)
else
if(j ==0)
else}if
(j == t.length)
else
return v;
}
C語言資料結構 9 串的樸素模式匹配演算法
查詢字串子串的位置的操作,稱為串的模式匹配,子串被稱為模式串。串的模式匹配是非常高頻的操作,具體如何去匹配的演算法也很重要。樸素模式匹配演算法也稱為布魯特 福斯演算法,感覺很是高大上,但是實現起來很簡單。樸素的意思就是最符合咱們樸素思維的演算法,從主串的第乙個字元開始與子串進行比對,如果相等則逐一比...
C語言資料結構中串的模式匹配
c語言資料結構中串的模式匹配 串的模式匹配問題 樸素演算法與kmp演算法 include include int index char s,char t,int pos else if j t 0 return i t 0 else return 0 int get next char t,int ...
C語言資料結構字串的模式匹配 BF演算法
串的模式匹配 bf演算法 找到相同的字串輸出在原字串中的位置 代表匹配字串在原字串中的位置 include include include define strsize 255 字串的最大長度 typedef char strtype 字元數字型別 typedef int statu 函式返回值的資...