1. public static int strStr(String ss, String pp) {
    2. if (pp.isEmpty()) return 0;
    3. // 分别读取原串和匹配串的长度
    4. int n = ss.length(), m = pp.length();
    5. // 原串和匹配串前面都加空格,使其下标从 1 开始
    6. ss = " " + ss;
    7. pp = " " + pp;
    8. char[] s = ss.toCharArray();
    9. char[] p = pp.toCharArray();
    10. // 构建 next 数组,数组长度为匹配串的长度(next 数组是和匹配串相关的)
    11. int[] next = new int[m + 1];
    12. // 构造过程 i = 2,j = 0 开始,i 小于等于匹配串长度 【构造 i 从 2 开始】
    13. for (int i = 2, j = 0; i <= m; i++) {
    14. // 匹配不成功的话,j = next(j)
    15. while (j > 0 && p[i] != p[j + 1]) j = next[j];
    16. // 匹配成功的话,先让 j++
    17. if (p[i] == p[j + 1]) j++;
    18. // 更新 next[i],结束本次循环,i++
    19. next[i] = j;
    20. }
    21. // 匹配过程,i = 1,j = 0 开始,i 小于等于原串长度 【匹配 i 从 1 开始】
    22. for (int i = 1, j = 0; i <= n; i++) {
    23. // 匹配不成功 j = next(j)
    24. while (j > 0 && s[i] != p[j + 1]) j = next[j];
    25. // 匹配成功的话,先让 j++,结束本次循环后 i++
    26. if (s[i] == p[j + 1]) j++;
    27. // 整一段匹配成功,直接返回下标
    28. if (j == m) return i - m;
    29. }
    30. return -1;
    31. }