【字符串处理】规则表达式的实现 -- 有限自动状态机

来源:互联网 发布:excel数据透视表怎么用 编辑:程序博客网 时间:2024/06/07 08:40

规则表达式在搜索模式串中可谓用途极广,那么他究竟通过什么算法达到那么大的威力呢?

答案就是字符串的额“有限自动状态机”,确切的说是模式串的有限自动状态机。所谓模式串就是你感兴趣的特定字符串,比如在谋篇文章中搜索"bai",这是模式字符串。对于这种

简单的串直接采用字符串匹配算法(例如KMP)之类的就可以解决了,采用KMP的时间复杂度是O(n+m),其中n是原串长度,m是模式串长度,如果m=O(n)的话,复杂度可以直接写为O(n),即搜索完一遍文章,就可以找到所有出现该模式串的起始位置。


以上是简单串的处理情况,那么对于某些特殊的查询需求就没办法满足了。例如你可能需要查找以bai开始,中间间隔一个任意字符,以lei结束的字符串,此时KMP不再适用。正确的方式是建立模式串的“有限自动状态机”,该状态机共有8种状态,起始状态是0,表示没有任何字符匹配。状态m表示原串长度为m的后缀子串,同时也是模式串长度为m的前缀子串,并且m是满足这种条件的最大值!(这句话非常重要,是自动状态机的核心,好好理解下)。随着输入字符的不同,状态机会由上一状态发生切换,变化到下一状态。当输入某字符使得状态机的状态变成8(串长加1)时,发生完全匹配,此时模式串被发现一次!在状态a下输入字符x,状态会切换到b,这个切换表示Pax最长后缀同时也是模式串P的最长前缀的长度是b,(具体例子以后补上)。


对于上一段提出的问题,就是在状态为3时(匹配了bai)输入任意一个字符,状态都会变成4,表示匹配了前4个字符。在状态4下只有输入了l才会切换到状态5,后缀根据实际输入决定切换到得状态! -- 这就是字符串的有限自动状态机解决实际问题的例子!