首页 > 编程语言 > 详细

javascript实现KMP算法(没啥实用价值,只供学习)

时间:2014-03-15 07:11:47      阅读:496      评论:0      收藏:0      [点我收藏+]

简单粗暴上代码

KMP的原理我就不讲了,想转过弯儿来不容易,建议大家先学会了怎么推导出next数组规律,然后准备两张纸,大纸上写上一行你要匹配的目标字符串,并分别写出位置编号,小纸上写上一行,也写上位置编号和对应的next数组编号,然后移动小纸片模拟匹配过程,你就会了。(用画图模拟也行)

bubuko.com,布布扣

从以上推导过程就能发现KMP算法的规律,得到如下代码:

推导next数组代码:

bubuko.com,布布扣
function KMPfunc(str) {
         var len = str.length;
         var j = -1, i = 0;
         var next = [-1];
         while (i < len) {
             if (j == -1 || str[i] === str[j]) {
                 j++;
                 i++;
                 //next[i] = j;

                 next.splice(i, 1, j);
             }
             else {
                 //j = next[j];
                 j = next.slice(j,j+1);
             }
         }
         next.shift();
         return next;
     }
bubuko.com,布布扣

KMP字符匹配算法

bubuko.com,布布扣
String.prototype.KMPsearch = function (str) {

         var len = str.length;
         var sstr = this.toString();
         var slen = sstr.length;
         var i = 0, j = 0, k = 0;
         if (slen > 1) {
             var next = KMPfunc(this.toString());
             while (i < len) {
                 if (str[i] === sstr[j]) {
                     if (j == (slen - 1)) {
                         if (i == (len - 1)) {
                             return k + 1;
                         }
                         else {
                             k++;
                             j = 0;
                         }
                     }
                     else {
                         j++;
                         i++;
                     }
                 }
                 else if (i == (len - 1) && str[i] != sstr[i]) {
                     return k;
                 }
                 else {
                     if (j == 0) {
                         i++;
                     }
                     else {
                         j = next[j - 1];
                     }

                 }
             }
         }
         else {
             for (var i = 0; i < len; i++) {
                 if (sstr == str[i]) {
                     k++;
                 }
             }
             return k;
         }
     };
bubuko.com,布布扣

javascript实现KMP算法(没啥实用价值,只供学习),布布扣,bubuko.com

javascript实现KMP算法(没啥实用价值,只供学习)

原文:http://www.cnblogs.com/JhoneLee/p/3601092.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!