28、Implement strStr()-------KMP算法(*)

题目

这道题目其实就是实现KMP算法,并且该算法也是比较经典的算法,需要很好的掌握:

贴上几个介绍字符串匹配的算法说明链接

http://www.cnblogs.com/Su-30MKK/archive/2012/09/17/2688122.html

本题实现代码:

 1 class Solution {
 2 public:
 3     int strStr(string haystack, string needle) {
 4          if("" == needle)
 5             return 0;
 6         if("" == haystack )
 7             return -1;
 8        
 9         return kmp(haystack,needle);
10 
11     }
12     int kmp(const std::string& s, const std::string& p, const int sIndex = 0)
13     {
14         std::vector<int>next(p.size());
15         getNext(p, next);//获取next数组,保存到vector中
16 
17         int i = sIndex, j = 0;
18         while(i != s.length() && j != p.length())
19         {
20             if (j == -1 || s[i] == p[j])
21             {
22                 ++i;
23                 ++j;
24             }
25             else
26             {
27                 j = next[j];
28             }
29         }
30 
31         return j == p.length() ? i - j: -1;
32     }
33     void getNext(const std::string &p, std::vector<int> &next)
34     {
35         next.resize(p.size());
36         next[0] = -1;
37 
38         int i = 0, j = -1;
39 
40         while (i != p.size() - 1)
41         {
42             //这里注意,i==0的时候实际上求的是next[1]的值,以此类推
43             if (j == -1 || p[i] == p[j])
44             {
45                 ++i;
46                 ++j;
47                 next[i] = j;
48             }
49             else
50             {
51                 j = next[j];
52             }
53         }
54     }
55 };