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

     1.思路确实不好想:   尤其是下一个为* 的情况!

     

      解这题需要把题意仔细研究清楚,反正我试了好多次才明白的。

        首先,考虑特殊情况:
             1>两个字符串都为空,返回true
             2>当第一个字符串不空,而第二个字符串空了,返回false(因为这样,就无法
                匹配成功了,而如果第一个字符串空了,第二个字符串非空,还是可能匹配成
                功的,比如第二个字符串是“a*a*a*a*”,由于‘*’之前的元素可以出现0次,
                所以有可能匹配成功)
        之后就开始匹配第一个字符,这里有两种可能:匹配成功或匹配失败。但考虑到pattern
        下一个字符可能是‘*’, 这里我们分两种情况讨论:pattern下一个字符为‘*’或
        不为‘*’:
              1>pattern下一个字符不为‘*’:这种情况比较简单,直接匹配当前字符。如果
                匹配成功,继续匹配下一个;如果匹配失败,直接返回false。注意这里的
                “匹配成功”,除了两个字符相同的情况外,还有一种情况,就是pattern的
                当前字符为‘.’,同时str的当前字符不为‘’。
              2>pattern下一个字符为‘*’时,稍微复杂一些,因为‘*’可以代表0个或多个。
                这里把这些情况都考虑到:
                   a>当‘*’匹配0个字符时,str当前字符不变,pattern当前字符后移两位,
                    跳过这个‘*’符号;
                   b>当‘*’匹配1个或多个时,str当前字符移向下一个,pattern当前字符
                    不变。(这里匹配1个或多个可以看成一种情况,因为:当匹配一个时,
                    由于str移到了下一个字符,而pattern字符不变,就回到了上边的情况a;
                    当匹配多于一个字符时,相当于从str的下一个字符继续开始匹配)
        之后再写代码就很简单了。
     
     
     
    class Solution {
    public:
        bool match(char* str, char* pattern)
        {
        if(str==nullptr||pattern==nullptr)//异常处理
          return false;
        if(*str == '' && *pattern == '')
         return true;
        if(*str != '' && *pattern == '') 
         return false;
        if(*(pattern+1)!='*' )//底下递归 也循环的起来 
        {
          if(*str==*pattern||(*str!=''&&*pattern=='.')   )//.可以替换所有东西
           return  match(str+1, pattern+1);//点也当一个数,向后移动一个数吧
          else
           return false;//可能出现什么别的字符 退出
        }else {//复杂情况
            if((*str==*pattern)||*str!=''&&*pattern=='.')
                return match(str, pattern+2) ||match(str+1, pattern); 
            else  //*面前代表0个  即跳过* 
            return match(str, pattern+2); 
        }  
        }
    };
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    class Solution {
    public:
        bool match(char* str, char* pattern)
        {
            if (*str == '' && *pattern == '')
                return true;
            if (*str != '' && *pattern == '')
                return false;
            //if the next character in pattern is not '*'
            if (*(pattern+1) != '*')
            {
                if (*str == *pattern || (*str != '' && *pattern == '.'))
                    return match(str+1, pattern+1);
                else
                    return false;
            }
            //if the next character is '*'
            else
            {
                if (*str == *pattern || (*str != '' && *pattern == '.'))
                    return match(str, pattern+2) || match(str+1, pattern);
                else
                    return match(str, pattern+2);
            }
        }
    };



  • 相关阅读:
    libpcap编程实例
    libnet发包例子(tcp udp arp广播)
    C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)
    创建一个实例&创建一个线程。。
    (转)C#中的 Interfaces (For 初学者们)
    C#中接口声明属性,但是提示“接口”中不能有属性。
    十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧。
    C#中的多态性
    Windows 程序支持 Unicode
    Python 中的函数与类的方法
  • 原文地址:https://www.cnblogs.com/cgy1012/p/11382891.html
Copyright © 2011-2022 走看看