字符串匹配-kmp算法
问题: 有字符串a、b, 求字符串a是否包含字符串b,如果包含, 返回起始位置。
解法1. 暴力破解。
从a的第一个字符起,移动n(n为b的长度), 判断a和b相应位置的字符是否匹配, 如不匹配则从a的第2位起,重复前述过程, 直至完全匹配上,或移动至a结尾(ps: 不用移动至a结尾, 移动到m-n位即可, m是a的长度)。
1 public static int contains(String a, String b) { 2 if(a.equals(null) || b.equals(null)) { 3 return -1; 4 } 5 if(a.length() < b.length()) { 6 return -1; 7 } 8 int i = 0, j =0; 9 while(i<=a.length() - b.length() && j<b.length()) { 10 if(a.charAt(i+j) == b.charAt(j)) { 11 j++; 12 }else { 13 j = 0; 14 i++; 15 } 16 } 17 if(j==b.length()) { 18 return i; 19 } 20 return -1; 21 }
该方法的时间复杂度为O(n2),等同于:
1 public static int contains(String a, String b) { 2 if(a.equals(null) || b.equals(null)) { 3 return -1; 4 } 5 if(a.length() < b.length()) { 6 return -1; 7 } 8 9 int i = 0; 10 while(i<=a.length() - b.length()) { 11 int j = 0; 12 while(j<b.length()) { 13 if(a.charAt(i+j) == b.charAt(j)) { 14 j++; 15 }else { 16 break; 17 } 18 } 19 20 if(j==b.length()) { 21 return i; 22 } 23 i++; 24 } 25 return -1; 26 }
解法2. kmp算法