• 正则表达式匹配


    题目:请实现一个函数用来匹配包含'.'和‘*'的正则表达式.模式中的字符'.'表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串“aaa"与模式“a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。
    每次从字符串里拿出一个字符和模式中的字符去匹配.先来分析如何匹配一个字符.如果模式中的字符ch是'.',那么它可以匹配字符串中的任意字符.如果模式中的字符ch不是'.'而且字符串中的字符也是ch,那么它们互相匹配.当字符串中的字符和模式中的字符相互匹配时,接着匹配后面的字符.
    相对而言当模式中的第二个字符不是'*'时问题要简单的很多.如果字符串中的第一个字符和模式中的第一个字符相匹配,那么在字符串和模式上都向后移动一个字符,然后匹配剩余的字符串和模式.如果字符串中的第一个字符和模式中的第一个字符不相匹配,则直接返回false.
                                           
       图中 模式ba*ab的非确定有限状态机.当匹配进入状态2并且字符串的字符是'a'时,有两个选择:可以进入状态3,也可以回到状态2
    当模式中的第二个字符是'*'时问题要复杂一些,因为可能有多种不同的匹配方式.一个选择是在模式上向后移动两个字符.这相当于'*'和它前面的字符被忽略掉了,因为'*'可以匹配字符串中的0个字符.如果模式中的第一个字符和字符串中的第一个字符相匹配时,则在字符串向后移动一个字符,而在模式上有两个选择:我们可以在模式上向后移动两个字符,也可以保持模式不变.
    如图所示,当匹配进入状态2并且字符串的字符是'a'时,我们有两个选择:可以进入状态3(在模式上向后移动两个字符),也可以回到状态2(模式保持不变)
    根据上述分析,可以写出如下代码:
     1 bool match(char* str,char* pattern)
     2 {
     3  if(str==NULL||pattern==NULL)
     4  return false;
     5  return matchCore(str,pattern);
     6  }
     7 
     8  bool matchCore(char* str,char* pattern)
     9  {
    10   if(*str==''&&*pattern=='')
    11   return true;
    12   if(*str!=''&&*pattern=='')
    13   return false;
    14   if(*(pattern+1)=='*')
    15   {
    16    if(*pattern==*str||(*pattern=='.'&&*str!=''))
    17    return matchCore(str+1,pattern+2)||matchCore(str+1,pattern)||matchCore(str,pattern+2);
    18                   //move on the next state      //stay on the current state      //ignore a'*'
    19    else  //ignore a'*'
    20    return matchCore(str,pattern+2);
    21    }
    22   if(*str==*pattern||(*pattern=='.'&&*str!=''))
    23   return matchCore(str+1,pattern+1);
    24   return false;
    25 }
  • 相关阅读:
    大话设计模式系列目录
    C#中三层架构UI、BLL、DAL、Model实际操作
    设计模式之六大原则(单一职责 开闭 里氏替换,依赖倒置 接口隔离 迪米特)
    UML类图的各种关系(继承、实现、依赖、关联、组合、聚合)
    C#即时窗口输出方法
    asp.net处理get,post数据
    C#同步调用异步方法
    Linux解压时报tar: node-v0.10.26-linux-x86/bin/npm: Cannot create symlink to `../lib/node_modules/npm/bin/npm-cli.js': Protocol error
    Ruby中require,load,include,extend的区别
    rspec入门
  • 原文地址:https://www.cnblogs.com/wxdjss/p/5450083.html
Copyright © 2020-2023  润新知