当前位置:   article > 正文

Java实现KMP算法_kmp java算法

kmp java算法
  1. package arithmetic;
  2. /**
  3. * Java实现KMP算法
  4. *
  5. * 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针,
  6. * 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远
  7. * 的一段距离后,继续进行比较。
  8. *
  9. * 时间复杂度O(n+m)
  10. *
  11. * @author xqh
  12. *
  13. */
  14. public class KMPTest {
  15. public static void main(String[] args) {
  16. String s = "abbabbbbcab"; // 主串
  17. String t = "bbcab"; // 模式串
  18. char[] ss = s.toCharArray();
  19. char[] tt = t.toCharArray();
  20. System.out.println(KMP_Index(ss, tt)); // KMP匹配字符串
  21. }
  22. /**
  23. * 获得字符串的next函数值
  24. *
  25. * @param t
  26. * 字符串
  27. * @return next函数值
  28. */
  29. public static int[] next(char[] t) {
  30. int[] next = new int[t.length];
  31. next[0] = -1;
  32. int i = 0;
  33. int j = -1;
  34. while (i < t.length - 1) {
  35. if (j == -1 || t[i] == t[j]) {
  36. i++;
  37. j++;
  38. if (t[i] != t[j]) {
  39. next[i] = j;
  40. } else {
  41. next[i] = next[j];
  42. }
  43. } else {
  44. j = next[j];
  45. }
  46. }
  47. return next;
  48. }
  49. /**
  50. * KMP匹配字符串
  51. *
  52. * @param s
  53. * 主串
  54. * @param t
  55. * 模式串
  56. * @return 若匹配成功,返回下标,否则返回-1
  57. */
  58. public static int KMP_Index(char[] s, char[] t) {
  59. int[] next = next(t);
  60. int i = 0;
  61. int j = 0;
  62. while (i <= s.length - 1 && j <= t.length - 1) {
  63. if (j == -1 || s[i] == t[j]) {
  64. i++;
  65. j++;
  66. } else {
  67. j = next[j];
  68. }
  69. }
  70. if (j < t.length) {
  71. return -1;
  72. } else
  73. return i - t.length; // 返回模式串在主串中的头下标
  74. }
  75. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/662149
推荐阅读
相关标签
  

闽ICP备14008679号