给定两个字符串A、B,判断B在A中是否存在,存在返回A中的下标,不存在返回-1
    例:
    A: ABCABCAABCABCD
    B: ABCABCD
    返回值:7

    解法一:调用API,String的indexOf方法

    1. private static int indexOfStr_i(String str, String sub) {
    2. return str.indexOf(sub);
    3. }

    解法二:暴力破解

    1. // 暴力破解
    2. private static int bf(String str, String pattern) {
    3. int len_str = str.length();//主串的长度信息
    4. int len_sub = pattern.length();//子串的长度信息
    5. int i = 0;//主串开始位置
    6. int j = 0;//子串开始位置
    7. while(i<len_str && j<len_sub) {
    8. if(str.charAt(i) == pattern.charAt(j)) {//如果相等,两者同时向后走,i++,j++
    9. i++;
    10. j++;
    11. }
    12. else {//不相等 i回退到i-j+1 j回退开始位置0
    13. i = i-j+1;//i-j是这一趟的开始位置 这一趟的下一个位置:i-j+1
    14. j = 0;
    15. }
    16. }
    17. //此时while循环退出 两种情况,要么i走出范围 要么j走出范围
    18. if(j >= len_sub) {//如果子串的j走出范围,找到了,返回i-j
    19. return i-j;
    20. }
    21. else {//否则没有找到,匹配失败,返回-1
    22. return -1;
    23. }
    24. }

    BF算法的问题效率太低 ,时间复杂度是O(n*m)

    解法三:KMP算法-KMP详解

    1. public class stringSearch {
    2. public static void main(String[] args) {
    3. String str = "ABCABCAABCABCD";
    4. String pattern = "ABCABCD";
    5. int[] next = new int[pattern.length()];
    6. getNext(pattern.toCharArray(), next);
    7. int i = search(str.toCharArray(), pattern.toCharArray(), next);
    8. System.out.println(Arrays.toString(next));
    9. System.out.println(i);//kmp
    10. }
    11. private static void getNext(char[] pattern, int[] next) {
    12. next[0] = -1;
    13. int i = 0, j = -1;
    14. while (i < pattern.length) {
    15. if(j == -1) {
    16. j++;
    17. i++;
    18. }else if (pattern[i] == pattern[j]) {
    19. i++;
    20. j++;
    21. next[i] = j;
    22. }else {
    23. j = next[j];
    24. }
    25. }
    26. }
    27. private static int search(char[] str, char[] pattern, int[] next) {
    28. int i = 0, j = 0;
    29. while (i < str.length && j < pattern.length) {
    30. if (str[i] == pattern[j] || j == -1) {
    31. i++;
    32. j++;
    33. }else {
    34. j = next[j];
    35. }
    36. }
    37. if (j == pattern.length) {
    38. return i - j;
    39. }else {
    40. return -1;
    41. }
    42. }
    43. }