c# 實現KMP演算法的示例程式碼
阿新 • • 發佈:2020-11-23
KMP演算法是一種改進的字串匹配演算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱KMP演算法)。KMP演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是通過一個next()函式實現,函式本身包含了模式串的區域性匹配資訊。KMP演算法的時間複雜度O(m+n) 。
實現方式就不再這裡獻醜了,網上很多講解,此處只是記錄下c#實現的程式碼。
public class KMP { public static int[] GetNext(String ps) { char[] p = ps.ToArray(); int[] next = new int[p.Length]; next[0] = -1; int j = 0; int k = -1; while (j < p.Length - 1) { if (k == -1 || p[j] == p[k]) { next[++j] = ++k; } else { k = next[k]; } } return next; } public static int GetIndex(String ts,String ps) { char[] t = ts.ToArray(); char[] p = ps.ToArray(); int i = 0; // 主串的位置 int j = 0; // 模式串的位置 int[] next = GetNext(ps); while (i < t.Length && j < p.Length) { if (j == -1 || t[i] == p[j]) { // 當j為-1時,要移動的是i,當然j也要歸0 i++; j++; } else { // i不需要回溯了 // i = i - j + 1; j = next[j]; // j回到指定位置 } } if (j == p.Length) { return i - j; } else { return -1; } } } //test static void Main(string[] args) { Console.WriteLine( KMP.GetIndex("abcdbcxdbc","dbc")); Console.ReadKey(); }
以上就是c# 實現KMP演算法的示例程式碼的詳細內容,更多關於c# kmp演算法的資料請關注我們其它相關文章!