给定两个字符串A、B,判断B在A中是否存在,存在返回A中的下标,不存在返回-1
例:
A: ABCABCAABCABCD
B: ABCABCD
返回值:7
解法一:调用API,String的indexOf方法
private static int indexOfStr_i(String str, String sub) {return str.indexOf(sub);}
解法二:暴力破解
// 暴力破解private static int bf(String str, String pattern) {int len_str = str.length();//主串的长度信息int len_sub = pattern.length();//子串的长度信息int i = 0;//主串开始位置int j = 0;//子串开始位置while(i<len_str && j<len_sub) {if(str.charAt(i) == pattern.charAt(j)) {//如果相等,两者同时向后走,i++,j++i++;j++;}else {//不相等 i回退到i-j+1 j回退开始位置0i = i-j+1;//i-j是这一趟的开始位置 这一趟的下一个位置:i-j+1j = 0;}}//此时while循环退出 两种情况,要么i走出范围 要么j走出范围if(j >= len_sub) {//如果子串的j走出范围,找到了,返回i-jreturn i-j;}else {//否则没有找到,匹配失败,返回-1return -1;}}
BF算法的问题效率太低 ,时间复杂度是O(n*m)
解法三:KMP算法-KMP详解
public class stringSearch {public static void main(String[] args) {String str = "ABCABCAABCABCD";String pattern = "ABCABCD";int[] next = new int[pattern.length()];getNext(pattern.toCharArray(), next);int i = search(str.toCharArray(), pattern.toCharArray(), next);System.out.println(Arrays.toString(next));System.out.println(i);//kmp}private static void getNext(char[] pattern, int[] next) {next[0] = -1;int i = 0, j = -1;while (i < pattern.length) {if(j == -1) {j++;i++;}else if (pattern[i] == pattern[j]) {i++;j++;next[i] = j;}else {j = next[j];}}}private static int search(char[] str, char[] pattern, int[] next) {int i = 0, j = 0;while (i < str.length && j < pattern.length) {if (str[i] == pattern[j] || j == -1) {i++;j++;}else {j = next[j];}}if (j == pattern.length) {return i - j;}else {return -1;}}}
