zcq
    KMP算法匹配字符串 和 字符串暴力匹配 两段代码

    1. package com.atguigu.kmp;
    2. import java.util.Arrays;
    3. public class KMPAlgorithm {
    4. public static void main(String[] args) {
    5. // TODO Auto-generated method stub
    6. String str1 = "BBC ABCDAB ABCDABCDABDE";
    7. String str2 = "ABCDABD";
    8. //String str2 = "BBC";
    9. int[] next = kmpNext("ABCDABD"); //[0, 1, 2, 0]
    10. System.out.println("next=" + Arrays.toString(next));
    11. int index = kmpSearch(str1, str2, next);
    12. System.out.println("index=" + index); // 15了
    13. }
    14. //写出我们的kmp搜索算法
    15. /**
    16. *
    17. * @param str1 源字符串
    18. * @param str2 子串
    19. * @param next 部分匹配表, 是子串对应的部分匹配表
    20. * @return 如果是-1就是没有匹配到,否则返回第一个匹配的位置
    21. */
    22. public static int kmpSearch(String str1, String str2, int[] next) {
    23. //遍历
    24. for(int i = 0, j = 0; i < str1.length(); i++) {
    25. //需要处理 str1.charAt(i) != str2.charAt(j), 去调整j的大小
    26. //KMP算法核心点, 可以验证...
    27. while( j > 0 && str1.charAt(i) != str2.charAt(j)) {
    28. j = next[j-1];
    29. }
    30. if(str1.charAt(i) == str2.charAt(j)) {
    31. j++;
    32. }
    33. if(j == str2.length()) {//找到了 // j = 3 i
    34. return i - j + 1;
    35. }
    36. }
    37. return -1;
    38. }
    39. //获取到一个字符串(子串) 的部分匹配值表
    40. public static int[] kmpNext(String dest) {
    41. //创建一个next 数组保存部分匹配值
    42. int[] next = new int[dest.length()];
    43. next[0] = 0; //如果字符串是长度为1 部分匹配值就是0
    44. for(int i = 1, j = 0; i < dest.length(); i++) {
    45. //当dest.charAt(i) != dest.charAt(j) ,我们需要从next[j-1]获取新的j
    46. //直到我们发现 有 dest.charAt(i) == dest.charAt(j)成立才退出
    47. //这时kmp算法的核心点
    48. while(j > 0 && dest.charAt(i) != dest.charAt(j)) {
    49. j = next[j-1];
    50. }
    51. //当dest.charAt(i) == dest.charAt(j) 满足时,部分匹配值就是+1
    52. if(dest.charAt(i) == dest.charAt(j)) {
    53. j++;
    54. }
    55. next[i] = j;
    56. }
    57. return next;
    58. }
    59. }
    1. package com.atguigu.kmp;
    2. public class ViolenceMatch {
    3. public static void main(String[] args) {
    4. // TODO Auto-generated method stub
    5. //测试暴力匹配算法
    6. String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
    7. String str2 = "尚硅谷你尚硅你~";
    8. int index = violenceMatch(str1, str2);
    9. System.out.println("index=" + index);
    10. }
    11. // 暴力匹配算法实现
    12. public static int violenceMatch(String str1, String str2) {
    13. char[] s1 = str1.toCharArray();
    14. char[] s2 = str2.toCharArray();
    15. int s1Len = s1.length;
    16. int s2Len = s2.length;
    17. int i = 0; // i索引指向s1
    18. int j = 0; // j索引指向s2
    19. while (i < s1Len && j < s2Len) {// 保证匹配时,不越界
    20. if(s1[i] == s2[j]) {//匹配ok
    21. i++;
    22. j++;
    23. } else { //没有匹配成功
    24. //如果失配(即str1[i]! = str2[j]),令i = i - (j - 1),j = 0。
    25. i = i - (j - 1);
    26. j = 0;
    27. }
    28. }
    29. //判断是否匹配成功
    30. if(j == s2Len) {
    31. return i - j;
    32. } else {
    33. return -1;
    34. }
    35. }
    36. }