算法 - KMP算法(字符串匹配)

本是古典 何须时尚 2023-07-03 10:47 117阅读 0赞

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

百度的一个图文介绍http://www.sohu.com/a/336648975_453160

  1. package Algorithm.kmp;
  2. import java.util.Arrays;
  3. public class KMPViolenceMatch {
  4. public static void main(String[] args) {
  5. String str1 = "BBC ABCDAB ABCDABCDABDE";
  6. String str2 = "ABCDABD";
  7. int [] next = kmpNext(str2);
  8. int kmpsearch = kmpsearch(str1, str2, next);
  9. System.out.println("next[] = " + Arrays.toString(next));
  10. System.out.println("index = " + kmpsearch);
  11. }
  12. public static int kmpsearch(String str1, String str2,int [] next){
  13. //遍历str1,i指向str1,j指向str2
  14. for (int i = 0, j = 0; i < str1.length(); i++) {
  15. //str1.charAt(i) != str2.charAt(j),调整j大小
  16. //回到匹配表的值相同的下一位
  17. while (j > 0 && str1.charAt(i) != str2.charAt(j)){
  18. j = next[j - 1];
  19. }
  20. if (str1.charAt(i) == str2.charAt(j)){
  21. j++;
  22. }
  23. if (j == str2.length()){
  24. return i - j + 1;
  25. }
  26. }
  27. return -1;
  28. }
  29. //获取到一个字符串(子串)的部分匹配值表
  30. public static int[] kmpNext(String dest){
  31. //创建一个next数组保存部分匹配值
  32. int [] next = new int[dest.length()];
  33. //如果只有一个字符的话那么next[0] = 0;
  34. next[0] = 0;
  35. for (int i = 1, j = 0; i < dest.length(); i++) {
  36. //dest.charAt(i) != dest.charAt(j),我们需要从next[j-1]获取新的j
  37. //直到我们发现有dest.charAt(i) == dest.charAt(j)退出
  38. //就是回溯到与下一个匹配值相同的位置,一直没有就是回溯到j = 0
  39. while (j > 0 && dest.charAt(i) != dest.charAt(j)){
  40. j = next[j-1];
  41. }
  42. //这是dest.charAt(i) == dest.charAt(j)时
  43. //这个条件满足时,部分匹配值就+1
  44. if (dest.charAt(i) == dest.charAt(j)){
  45. j++;
  46. }
  47. next[i] = j;
  48. }
  49. return next;
  50. }
  51. }

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读

    相关 字符串匹配算法(KMP)

    1、BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等

    相关 算法KMP字符串匹配

    算法—KMP字符串匹配 现在有一个问题,要从一个字符串中查找出指定子串的位置(初始下标),通常地,我们会使用朴素的字符串匹配算法,如下面这道题 给出主串和需要查找