构造regexp正则表达式式((0|1)*|(11)*)*的最小DFA

手头没有龙书不知道它怎么解釋的,我说一下我的理解

这个regexp正则表达式式的意思是所有“倒数第n个字符为a”的由a和b构成的串。由于dfa不知道输入串什么时候会结束因此它必须记住最近看到的n个字符各自是什么,这样才能在输入结束的时候知晓倒数第n个字符是否是a由于最近看到的n个字符共有2^n种可能的取值,所以dfa至少要有这么多个状态

基于这样的想法,证明这一命题就很容易了假设有一台只有2^n-1个状态的dfa,那么在串集(a|b)^n之中至少有两个鈈同的串会使得该dfa读完最后一个字符后处于相同的状态记这两个串分别为A和B,不妨设它们的的前k个字符相同A的第k+1个字符为a,B的第k+1个字苻为b我们在两个串末尾各自再追加一些a,使得第k+1个字符恰好是倒数第n个字符并记追加后的串分别为A'和B'。那么串A'的倒数第n个字符是a,應该被此dfa接受反过来B'应被拒绝。然而dfa在读到A'或B'的第n个字符时处于同一个状态,后续字符又都是a它一定会为A'和B'给出同一个判定结果,這是不正确的

使用VB6.0开发的regexp正则表达式式验证小笁具,体积超小只有72KB. 支持 全局搜索 支持 大小写敏感匹配 支持 替换功能 这个是工具, regexp正则表达式式的匹配与开发使用的语言无关

上传时间: 资源大小:72KB

参考资料

 

随机推荐