zoukankan      html  css  js  c++  java
  • 正则表达式匹配

    题目:请实现一个函数用来匹配包含'.'和‘*'的正则表达式.模式中的字符'.'表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含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 }
  • 相关阅读:
    个人阅读2
    代码复审
    PairProject 总结
    Pairproject 移山之道 阅读随笔和一些问题
    M1/M2个人总结
    团队项目个人总结
    个人阅读作业2
    代码互审
    《移山之道》读后感
    Individual Project
  • 原文地址:https://www.cnblogs.com/wxdjss/p/5450083.html
Copyright © 2011-2022 走看看