這兩天在研究關於字串匹配的kmp演算法,其中需要求串的next值,看了很多演算法描述和**,一開始有點繞,然後多看了幾篇,慢慢就理解了。自己目前掌握的有兩種求字串next值的方法,下面用簡單通俗的描述記錄下來。
以字串ababaaababaa(下文也稱為字串s)為例,其next值為011234223456,下面介紹兩種求解方法,其中無論是字串s或是next陣列,下標均從1開始(注意不是0),即下標為1-12。且next前兩個值預設設定為0,1:next[1]=0,next[2]=1。
1.通俗描述
若字串長度為length,則next陣列也有length個值,當求解第i個next值時(1 <= i <= length,其實next[1],next[2]可以不算的,因為無論怎麼算都是0,1),取字串s的前i-1個字元,再取這i-1個字元的最長字首字串front(前i-2個字元)和最長字尾字串back(後i-2個字元),其實就是去掉這i-1個字串的最後乙個和最前乙個。然後對front和back進行匹配,匹配到的字串,必須是front的頭,以及back的尾,(其實此處匹配的也可以理解成字串的字首集合和字尾集合的交集中最長的字串)若匹配到的字串長度為l,則next[i]=l+1,若沒有匹配到,則next[i]為1。這個匹配部分這樣講有點難理解,看一下下面的求解過程就清楚了。
2.求解過程1.通俗描述
字串s的下標從1開始算,next陣列下標也從1開始算,所以s每個字元都對應乙個next值。next[1],next[2]還是設定為0,1。當求next[i]時,即求字串s的第i個字元對應的next值,求next[i],首先獲得前乙個next值和對應的字元,即s[i-1]和next[i-1]。用next[i-1]作為s的下標,判斷s[i-1]和s[next[i-1]]是否相同,如果相同,則next[i] = next[i-1]+1。否則,保留s[i-1]這個字串(這個字串是用來比較的),再用s[next[i-1]]這個字串對應的next(我們這裡成這個next值為new_next,不要和前面混亂了)來作為剛剛next[i-1]的作用。即判斷s[i-1]和s[nex_next]是否一樣,如果相同,next[i]=new_next+1,否則繼續往起直到找不到相同的,則next[i]=1。這裡有點難理解,所以下面我會詳細講一遍具體怎麼求法,但是建議還是邊畫邊看,理解起來才容易。
2.求解過程
字串反轉的兩種方法
名稱 字串反轉的兩種方法 說明 此處用了兩種方法進行前後對稱字串互換,常規的方法是第乙個字元和最後 乙個字元互換,第二個字元和倒數第二個字元互換 第二個方法是利用函式遞迴,即str為abcde,每次遞迴使之處理的str為bcde cde de e,然後e ed edc edcb edcba,達到反轉...
qt 分割字串的兩種方法
1.split 按照指定的字元分割,如按照 或 等分割 qstring str hello,world qstringlist list str.split qstring a list 0 a hello qstring b list 1 b world str2 worldhello 2.min...
關於字串替換的兩種方法
很多時候我們會遇到後台返回的是乙個引數,還需要有乙個對照表進行資料替換,替換後再進行文字展示,但有的時候後台傳遞的引數是幾個又不太能確定,所以簡單寫了個解決 方法的話有兩種,一種是根據後端傳遞的資料分割符號進行分割,分割後for迴圈逐一替換後再拼接成字串返回,第二種是通過replace方法進行reg...