KMP算法的实现

两个字符串 主串="aabaabcf" 模板串"aabcf"

如果两层for循环遍历的话当不符合的时候就会从模板串的头部重新开始遍历。

时间复杂度为0(mn)

所以引入kmp算法 

先定义一个next数组 用于知道当模板串的指针遍历到与主串不符合的时候 需要跳到的位置

代码如下

private void getNext(int []next,String s){

//不断遍历next数组   

j是前缀的末尾 i是后缀的末尾 也是当前所需要获取next[i]前的子字符串的前缀和后缀

        int j=0;

        next[0]=0;

        for(int i=1;i

          while(j>0&&s.charAt(j)!=s.charAt(i)){

              j=next[j-1];

          }

          if(s.charAt(j)==s.charAt(i)){

              j++;}

          next[i]=j;

          

        }

    }

最后获取next数组的值后 可以根据next数组来进行主串和模板串的匹配

next里面的值是最长相等前后缀的长度

public int strStr(String haystack, String needle) {

     if(needle.length()==0)return 0;

     int []next=new int [needle.length()];

     getNext(next,needle);

     int j=0;//模板串的指针

     for(int i=0;i

         while(j>0&&haystack.charAt(i)!=needle.charAt(j)) j=next[j-1];

         if(haystack.charAt(i)==needle.charAt(j)){

             j++;

         }

         if(j==needle.length()) return i - needle.length() + 1;

     }

     return -1;

    }

时间复杂度为O(m+n)

next数组遍历为O(n) 然后主函数中 最好的情况也只是 while循环里面 每次主串的指针往后遍历 而模板串都只在第一个和第二个反复横跳 所以为O(m) 所以总的就是O(m+n)

最坏的情况也只是 模式匹配的时候O(m+n) 总的也就是O(m+2n)

你可能感兴趣的:(java,前端,javascript)