数据结构第8讲 KMP算法
讲这个算法之前,我们首先了解几个概念:
串:又称字符串,是由零个或多个字符组成的有限序列。如S=”abcdef”
子串:串中任意个连续的字符组成的子序列,称为该串的子串,原串称为子串的主串。如T=”cde”,T是S的子串。子串在主串中的位置,用子串的第一个字符在主串中出现的位置表示。T在S中的位置为3。
模式匹配:子串的定位运算称为串的模式匹配或串匹配。
假设有两个串S,T,设S为主串,也称正文串,T为子串,也称为模式,在主串S中查找与模式T相匹配的子串,如果查找成功,返回匹配的子串第一个字符在主串中的位置。
最笨的办法就是穷举所有S的所有子串,判断是否与T匹配。
例如:S=”abaabaabeca”,T=” abaabe”,求子串T在主串S中的位置。
从S串第1个字符开始:i=1,j=1,比较两个字符是否相等,如果相等,则i++,j++;如果不等则执行第2步;
从S串第2个字符开始:即i退回到i-j+2的位置,即i=2,j=1,比较两个字符是否相等,如果相等,则i++,j++;如果不等则执行第3步;
从S串第3个字符开始:即i退回到i-j+2的位置,即i=3,j=1,比较两个字符是否相等,如果相等,则i++,j++;如果不等则执行第4步;
从S串第4个字符开始:即i退回到i-j+2的位置,即i=4,j=1,比较两个字符是否相等,如果相等,则i++,j++;此时T串比较完了,执行第5步;
需要返回子串在主串S中第一个字符出现的位置,即i-m=10-6=4,m为T串的长度。
上述算法称为BF(Brute Force)算法,Brute Force的意思是蛮力,暴力穷举。其时间复杂度最坏达到O(n*m),nÿ