字符串匹配-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     }
View Code

该方法的时间复杂度为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     }
View Code

 

解法2. kmp算法

 

posted @ 2018-07-01 15:06  淡季的风  阅读(132)  评论(1编辑  收藏  举报