資料結構 KMP演算法

2021-09-30 14:02:30 字數 1441 閱讀 5221

1.樸素演算法

樸素演算法即暴力匹配演算法,對於長度為n的文字串s和長度為m模式串p,在文字串s中是否存在乙個有效偏移i,其中 0≤ i < n - m + 1,使得 s[i… i+m - 1] = p[0 … m-1](注:下標從0開始),如果存在則匹配成功,否則匹配失敗。由於在匹配過程中一旦不匹配,就要讓模式串p相對於文字串s右移1,即i需要進行回溯,其時間複雜度為o(n*m)。

**實現

class

violentstringmatcher

implements

stringmatcher else

}// 匹配成功,則返回模式字串在原字串中首次出現的位置;否則返回-1

if (j == plen)

return i - j;

else

return -1;

}}

2.kmp演算法

(1)定義

(2)next陣列求解

(3)**實現

public

class kmp

public

void

setpattern(string pattern)

public

void

kmpmatcher()

if(pattern.charat(q) == text.charat(i))

q++;

if(q == m)

}if(count == 0)

}//求解next陣列

private

int computeprefix()

if(pattern.charat(k) == pattern.charat(i))

k++;

prefix[i] = k;

}return prefix;

}//求解next陣列的另一種方法

protected

int getnext(char p) else

}return next;

}//優化kmp演算法

protected

int ogetnext(char p) else

} else

}return next;

}public

intindexof(string source, string pattern) else

}if (j == plen)

return i - j;

return -1;

}public

static

void

main(string args)

}

本人才疏學淺,若有錯,請指出

謝謝!

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...

資料結構 KMP演算法

要完善乙個string字串類,那麼實現查詢子串的功能是必不可少的,實現子串查詢可以使用樸素演算法,每次匹配乙個字元後向右移動乙個位置,這樣執行下來效率是比較低的,所以就有了kmp演算法,它能夠準確的知道當前字元不匹配後字串應該向右移動多少位,由於剛接觸kmp演算法,所以很多還明白的不是很透徹,在此記...