c语言实现,普通模式匹配和KMP算法匹配(未实现next数组) #include <math.h> #include <stdio.h> #include <string.h> int common(char *target, int len, char *t, int n); int kmp(char *target, char *t, int next[]); int main(void) { char *target = "googlogoogoogle"; char *t = "google"; //朴素模式匹配算法测试,时间复杂度 len*n printf("%d\n", common(target, strlen(target), t, strlen(t))); int next[]={-1,0,0,0,1,2}; printf("%d\n", kmp(target, t, next)); } //朴素模式匹配算法,返回是元素索引+1 int common(char *target, int len, char *t, int n) { int i, j; //主串移动 for (i = 0; i <= len - n; i++) { //模式串移动 for (j = 0; j < n; j++) { if (target[i + j] != t[j]) break; } if (j == n) return i + 1; } return -1; } //kmp算法,next数组手算 int kmp(char *target, char *t, int next[]) { int i = 0, j = 0; while (i < strlen(target)) { //当第一个元素无法匹配或能匹配上时 if (j == -1 || target[i] == t[j]) { i++; j++; } else { j = next[j]; } //成功条件 if (j == strlen(t)) { return i-j+1; } } return -1; }
java实现,kmp算法完整
import java.util.Arrays; import java.util.Scanner; //实现kmp算法 public class Main { public static void main(String[] args) { //输入主串 Scanner sc = new Scanner(System.in); // String str = sc.nextLine(); //输入模式串 //String n = sc.nextLine(); String n = "ababaaababaa"; System.out.println(Arrays.toString(getNext(n))); } public static int kmp(String str, String n) { //获取next数组 int[] next = getNext(n); //获取主串和模式串的指针 int i = 0; int j = 0; while (i < str.length()) { //当第一个元素就无法 匹配时或者两个元素匹配成功时 if (j == -1 || str.charAt(i) == n.charAt(j)) { i++; j++; } else { j = next[j]; } } //成功,返回模式串在主串中的位置,即索引+1 if (j == n.length()) { return i - j + 1; } return -1; } //获取next数组 private static int[] getNext(String n) { //创建next数组 int[] next = new int[n.length()]; next[0] = -1; next[1] = 0; //当i的前一个元素和i的前一个元素的next值指向的元素相等时,i的next值就是j+1 //当不相等,就继续让i的前一个元素和该元素的下一个next值指向的元素比较,直到相等或next指向-1 for (int i = 2; i < n.length(); i++) { int j = next[i - 1]; while (j != -1 && n.charAt(i - 1) != n.charAt(j)) { j = next[j]; } next[i] = j + 1; } return next; } }