一、暴力子字符串查找算法:
public class Baoli { public static int search(String pattern, String txt) { int M = pattern.length(); int N = txt.length(); for (int i = 0; i < N-M; i++) { int j; for (j = 0; j < M; j++) if (txt.charAt(i+ j) != pattern.charAt(j)) break; if (j == M) return i; } return N; } public static int search2(String pattern, String txt) { int j, M = pattern.length(); int i, N = txt.length(); for (i = 0, j = 0; i < N&&j < M; i++) { if (txt.charAt(i) == pattern.charAt(j))j++; else {i -= j; j = 0;} } if (j == M) return i - M; else return N; } }二、KMP字符串查找算法:
public class KMP { private int[][] dfa; private String pat; public KMP(String pat) { this.pat = pat; int M = pat.length(); int R = 256; dfa = new int[R][M]; dfa[pat.charAt(0)][0] = 1; for (int X = 0, j = 1; j < M; j++) { for (int c = 0; c < R; c++) dfa[c][j] = dfa[c][X]; dfa[pat.charAt(j)][j] = j+1; X = dfa[pat.charAt(j)][X]; } } public int search(String txt) { int i,j, N = txt.length(),M = pat.length(); for (i = 0, j= 0; i < N && j < M ; i++) j = dfa[txt.charAt(i)][j]; if (j == M) return i - M; else return N; } }
三、Booyer-Moore字符串匹配算法:
public class BoyerMoore { private int[] right; private String pat; public BoyerMoore(String pat) { this.pat = pat; int R = 256; int M = pat.length(); right = new int[R]; for (int c = 0; c < R; c++) right[c] = -1; for (int j = 0; j < M; j++) right[pat.charAt(j)] = j; } public int search(String txt) { int M = pat.length(); int N = txt.length(); int skip; for (int i = 0; i <= N - M; i += skip) { skip = 0; for (int j = M - 1; j >= 0; j--) { if (txt.charAt(i+j) != pat.charAt(j)) { skip = j - right[txt.charAt(i+j)]; if (skip < 1) skip = 1; break; } } if (skip == 0) return i; } return N; } }三、Rabin-Karp指纹字符串查找算法:
public class RabinKarp { private int R = 256; private String pat; private int M; private int Q; private long RM; private long patHash; public RabinKarp(String pat) { this.pat = pat; this.M = pat.length(); Q = longRandomPrime(); RM = 1; for (int i = 0; i < M; i++) { RM = (RM * R) % Q; } patHash = hash(pat, M); } private long hash(String key, int M) { long h = 0; for (int i = 0; i < M; i++) h = (h * R + key.charAt(i)) % R; return h; } public boolean check(int i) {return true;} public int search(String txt) { int N = txt.length(); long txtHash = hash(txt, M); if (txtHash == patHash && check(0)) return 0; for (int i = M; i < N; i ++) { txtHash = (txtHash - txt.charAt(i - M)* RM + Q) % Q; txtHash = (txtHash * R + txt.charAt(i)) % Q; if (txtHash == patHash && check(i - M + 1)) return i - M + 1; } return N; } }