博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[小明学算法]6.字符串匹配算法---KMP
阅读量:5162 次
发布时间:2019-06-13

本文共 1985 字,大约阅读时间需要 6 分钟。

1.简介
   字符串匹配就是看看那字符串b是不是字符串a的子串.常用的Knuth-Morris-Pratt 算法,又称KMP算法.
 
2.主要思想
  当patter在某一位置与string匹配失败时,我们除了知道从string的这个位置进行匹配失败这个结果外,是否可以从前面的匹配中获得更多的信息呢。即当前匹配点匹配失败之后,向右滑动的距离是可以提前计算出来的.
 
3.举例
  
abcabcabcdef   --------- string
  abcabcdef         --------- pattern
  KMP就是利用已经匹配了的字符串这个信息,来进行尽可能的向右滑动,避免无谓的比较。匹配字符就是两个字符串的公共部分那么究竟当不匹配的时候,可以向右滑动多远呢?
  以上面的pattern "abcabcdef"为例:
    当第一个字符不匹配的时候,没有额外信息,那么就向右滑动1个字符。
    当第二个字符不匹配的时候,说明之前匹配的字符为a,但是我们是第二个字符不匹配,还是只能向右滑动1个字符。
    当第三个字符不匹配的时候,说明之前匹配的字符为ab,那么可以向右滑动2位;
    当第四个字符不匹配的时候,说明之前匹配的字符为abc,那么可以向右滑动3位;
    当第五个字符不匹配的时候,说明之前匹配的字符为abca,那么也只能向右滑动3位;
    。。。。。。
 
4.关键问题 
  那么KMP算法的关键问题就是计算pattern某位置匹配失败的时候,可以向右滑动的位数。
  下面白话一下如何计算这个滑动位数,0匹配和1匹配时,向右滑动都为1.当匹配数n(n>=2)的时候,在之前匹配的字符串t1中,新增加的字符串t2,且不是t1的23:20:05前端完全重合的字串,则滑动数值加一,否则结束.
 
5.代码
static void Main(string[] args)        {            char[] pattern = { 'a', 'b', 'c', 'a', 'b', 'c', 'd', 'e', 'f' };            int[] table = new int[pattern.Length];            cal_next_table(pattern, table);            Console.Read();        }        static void cal_next_table(char[] pattern,int[] table)        {            //设Table[0]为哨兵            table[0] = 1;            Print(pattern);            Print(table);            for (var i = 1; i < pattern.Length; i++)            {                            table[i] = table[i - 1];                //直接与pattern比较了,以免出现t2长度大于t1的情况                //var t1 = GetSubArr(pattern, 0, i);                //检测t2(注意起点)是否和t1头部重合,重合则break                for(var j=table[i];j
View Code

 

6.结果

a b c a b c d e f1 0 0 0 0 0 0 0 0aa b c a b c d e f1 1 0 0 0 0 0 0 0ba ba b c a b c d e f1 1 2 0 0 0 0 0 0ca b ca b c a b c d e f1 1 2 3 0 0 0 0 0aa b c aa b c a b c d e f1 1 2 3 3 0 0 0 0a ba b c a ba b c a b c d e f1 1 2 3 3 3 0 0 0a b ca b c a b ca b c a b c d e f1 1 2 3 3 3 3 0 0a b c db c dc dda b c a b c da b c a b c d e f1 1 2 3 3 3 3 7 0ea b c a b c d ea b c a b c d e f1 1 2 3 3 3 3 7 8
View Code
  1. abcabcdef
  2. 112333378

 

转载于:https://www.cnblogs.com/WongSiuming/p/5119943.html

你可能感兴趣的文章
编译原理 First,Follow,select集求法
查看>>
java 浅拷贝和深拷贝
查看>>
vue实例中中data属性三种写法
查看>>
uva1636 - Headshot(条件概率)
查看>>
iOS开发 runtime实现原理以及实际开发中的应用
查看>>
BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
查看>>
android 学习资源网址
查看>>
shell基础
查看>>
2018.1.15
查看>>
[集合DP] UVA 10651 Pebble Solitaire
查看>>
qt安装遇到的错误
查看>>
寻找完美平方数
查看>>
java:Apache Shiro 权限管理
查看>>
objective c的注释规范
查看>>
FreeNas安装配置使用
查看>>
机器学习中的F1-score
查看>>
编译安装php5.5.38
查看>>
常用查找数据结构及算法(Python实现)
查看>>
Scrapy框架-CrawlSpider
查看>>
Django(一)框架简介
查看>>