串的兩種模式匹配演算法

2021-10-25 15:20:27 字數 969 閱讀 4882

「靜時亦覺意思好,才遇事便不同,如何?」

「是徒知靜養而不用克己工夫也。如此,臨事便要傾倒。人須在事上磨,方立得住,

方能『靜亦定,動亦定。』」

此時正宜用功。若此時放過,閒時講學何用?人正要在此等時磨鍊。

子串的定位操作:串的模式匹配

挨個遍歷,例如在asdfghjkl中尋找dfg,需要將dfg與asdfghjkl從a~j依次進行比較,最壞結果時間複雜度很高(o(n-m+1)*m),非常低效。

關鍵點:1.看子串中前後是否有重複出現的字元(更加概括地說是觀察子串各元素的異同,結合主串進行分析,簡化運算。

next值:分類討論:j=1,next=0;若字首和字尾有重複,重複n個,next=n+1;其他情況(無重複),next=1;

需要注意的點,取j值,要看j-1的重複情況,不是j字串的重複情況。

**實現

/*通過計算返回子串t的next陣列*/

void

get_next

(string t,

int*next)

else

j=next[j];}

}

/*返回子串t在主串s中第pos個字元之後的位置。若不存在,則函式返回值為0*/

/*t非空 。1<=pos<=strlength(s)*/

//找出子串在主串中的位置

intindex_kmp

(string s ,string t,

int pos)

else}if

(j>t[0]

)//子串遍歷完畢

return i-t[0]

;else

return0;

}

可以對kmp演算法進行改進:nextval陣列代替next陣列,如果子串一位置後的元素和首元素的值一樣,就可以用一位置元素next值代替之後元素next值。

KMP模式匹配演算法 兩種

具體可分為 字首 prefix 法和next陣列法 1.思路 1 求出字首 prefix 表 2 依照字首 prefix 表來幫助匹配查詢 所以,找出字首 prefix 表是最核心的步驟 2.方法 給出兩種求字首 prefix 表的方法,這兩種方法的核心大致相當,都利用回溯的思想 本例中用指標j進行...

兩種簡單的字串匹配演算法

在機試筆記4中的統計子字串個數題目中,使用了一種時間複雜度為o n m 的字串匹配演算法,他也叫暴力匹配演算法或者bf演算法。在實際的開發中,它卻是乙個比較常用的字串匹配演算法。原因有以下幾點 第一,實際的軟體開發中,大部分情況下,模式串和主串的長度都不會太長。而且每次模式串與主串中的子串匹配的時候...

括號匹配(兩種演算法的完成)

題目描述 pipi給你乙個合法的括號序列,希望跟你按左括號下標遞增順序給出每對括號在序列中的下標。下標從1開始 輸入多組資料 第一行包括乙個只包含 的字串,保證輸入的括號匹配序列合法,長度不超過100000 輸出按左括號下標遞增順序給出每對括號在序列中的下標。樣例輸入 copy 樣例輸出 copy ...