最近研究算法,才發現字符串匹配居然有這麼多的算法能夠選擇,而且對字符串查找的效率也有提高,在這裏對幾個典型的算法作一個總結。各類算法的原理在全部算法書籍或者Google都能找到,這裏就再也不重複,只將本身實現的java版代碼貼下。html
/** * 原始字符串匹配 * * @param target * @param pattern * @return */ public static int originMatch(String target, String pattern) { int flag = -1; int tlen = target.length(); int plen = pattern.length(); int i = 0, j = 0; while ((i + j) < tlen && j < plen) { if (target.charAt(i + j) == pattern.charAt(j)) { j++; } else { i++; j = 0; } } if (j == plen) { flag = i; } return flag; }
/** * 採用KMP算法匹配字符串 * * @param target * @param pattern * @return */ public static int kmpMatch(String target, String pattern) { int flag = -1; char[] ps = pattern.toCharArray(); char[] ts = target.toCharArray(); int[] next = getNext(ps); int i = 0; int j = 0; while (i < ts.length && j < ps.length) { if (j == -1 || ps[j] == ts[i]) { i++; j++; } else { // if (next[j] == -1) { // i++; // j = 0; // } else if (next[j] == 0) { // j = 0; // } else if (next[j] > 0) { // j = next[j]; // } j = next[j]; } } if (j == ps.length) { flag = i - j; } return flag; } /** * KMP 取模式值next[n] * * @param ps * @return */ public static int[] getNext(char[] ps) { int[] next = new int[ps.length]; next[0] = -1; // 標記字符在字符數組中的位置 int i = 0; // 標記取值模式數組的位置 int j = -1; while (i < ps.length - 1) { if (j == -1 || ps[i] == ps[j]) { i++; j++; if (ps[i] != ps[j]) { next[i] = j; } else { next[i] = next[j]; } } else { j = next[j]; } } return next; }
/** * 字符串匹配之Sunday算法 * * @return */ public static int sundayMatch(String target, String pattern) { int flag = -1; int tlen = target.length(); int plen = pattern.length(); int i = 0;// 標記目標串的字符的開始位置 int j = 0;// 標記模式串的字符位置 int m = 0; //標記目標串匹配模式串的動態位置 while (i < tlen && j < plen) { if (i == 0 && j == 0) { if (target.charAt(i) != pattern.charAt(j)) { m = i + plen; for (int k = plen - 1; k >= 0; k--) { if (pattern.charAt(k) == target.charAt(m)) { i = i + (plen - k); break; } } } } if (target.charAt(i) != pattern.charAt(j)) { for (int k = (i + plen - j); k < tlen; k++) { if (target.charAt(k) == pattern.charAt(plen - 1)) { m = k; i = m - plen + 1; j = 0; break; } } } else { i++; j++; } } if (j == plen) { flag = i - plen; } return flag; }
代碼的github地址:
github地址java
留下的幾個好的參考博客:git
KMP字符串模式匹配詳解;github