• 算法-KMP匹配


    下面是原码

    BF暴力匹配

    1. public static int BF(String str1,String str2){
    2. /**
    3. * 这个其实就是我们的暴力匹配的算法,就是进行同步增加匹配,如果匹配不成功就把 j == 0; i == i - j + 1;
    4. */
    5. //这个其实我们这样写的好处还有一个就是以后不用在进行函数的调用消耗我们的内存
    6. int m = str1.length();
    7. int n = str2.length();
    8. int i = 0;//这个是我们主串的遍历位置
    9. int j = 0;//这个是我们字串的遍历位置
    10. while(i < m && j < n){
    11. if(str1.charAt(i) == str2.charAt(j)){
    12. i++;
    13. j++;
    14. }else{
    15. i = i - j + 1;//这里为什么置为这个数值是因为我们的i 跟 j 是同步变化的(下次便利的时候更换起点为这个值)
    16. j = 0;
    17. }
    18. }
    19. if(j == n){
    20. return i - j;
    21. }
    22. return -1;
    23. }

    KMP算法

    1. public static int[] getNext(String s,int strlen){
    2. int[] next = new int[strlen];
    3. if(strlen == 1){
    4. return new int[]{-1};
    5. }
    6. next[0] = -1;
    7. next[1] = 0;
    8. int cn = 0;// cn 就是我们的需要next数组的下标值前一个要比较的下标
    9. int i = 2;// i 就是我们需要的next数组的值的下标,(起始位置就是我们的2)
    10. while(i < strlen){
    11. if(s.charAt(i-1)==s.charAt(cn)){
    12. next[i++] = ++cn;
    13. }else if(cn > 0){
    14. cn = next[cn];
    15. }else{
    16. next[i++] = 0;
    17. }
    18. }
    19. return next;
    20. }
    21. public static int KMP(String str1,String str2){
    22. int m = str1.length();
    23. int n = str2.length();
    24. int[] next = getNext(str2,n);
    25. int i = 0;
    26. int j = 0;
    27. while(i < m && j < n){
    28. if(str1.charAt(i) == str2.charAt(j)){
    29. i++;
    30. j++;
    31. }else if(j == 0){
    32. i++;
    33. }else{
    34. j = next[j];
    35. }
    36. }
    37. return j == m ? i - j : -1;
    38. }

    暴力求解我们next数组

    1. public static int[] conNextArray(String str){
    2. int[] arr = new int[str.length()];
    3. arr[0] = -1;
    4. arr[1] = 0;
    5. for(int i = 2; i < str.length(); ++i){
    6. int count = 0;
    7. int flag = 0;
    8. for(int j = i - 1; j > 0; --j){
    9. if(str.substring(0,j).equals(str.substring(i - j, i))){
    10. if(flag != 1){
    11. arr[i] = j;
    12. flag = 1;
    13. break;
    14. }
    15. }
    16. }
    17. }
    18. return arr;
    19. }

  • 相关阅读:
    .NET周刊【9月第3期 2023-09-17】
    SpringSecurity学习笔记【授权部分待更新】
    第2章搭建CRM项目开发环境(搭建开发环境)
    基于深度强化学习的网约车动态路径规划
    JavaScript -- 正则表达式及示例代码介绍
    风电场统计数据名词
    基于springboot+vue的家政服务预约管理系统 elementui
    计算机算法分析与设计(9)---0-1背包问题(含C++代码)
    WebDAV之π-Disk派盘 + Xplore
    LeetCode 535(C#)
  • 原文地址:https://blog.csdn.net/2301_81486828/article/details/136686763