1. 程式人生 > >【重點】劍指offer——面試題53:正則表示式匹配

【重點】劍指offer——面試題53:正則表示式匹配

劍指offer——面試題53:正則表示式匹配

Solution1:

程式碼中的註釋寫的不是太清楚,加一點:
一、當模式中的第二個字元不是“*”時:
1、如果字串第一個字元和模式中的第一個字元相匹配,那麼字串和模式都後移一個字元,然後匹配剩餘的。
2、如果字串第一個字元和模式中的第一個字元相不匹配,直接返回false。
二、當模式中的第二個字元是“*”時:
如果字串第一個字元跟模式第一個字元不匹配,則模式後移2個字元,繼續匹配。如果字串第一個字元跟模式第一個字元匹配,可以有3種匹配方式:
1、x*匹配0個字元。模式後移2字元,相當於x*被忽略;(一開始忘了即使當前字元匹配,也存在忽略掉的情況!!!)
2、x*匹配1個字元。字串後移1字元,模式後移2字元;
3、x*匹配多於1個字元。字串後移1字元,模式不變,即繼續匹配字元下一位,因為*可以匹配多位;
注意:情況2可以被情況1和情況3包含。執行一次情況3,再執行一次情況1,就相當於情況2。

/*
    解這題需要把題意仔細研究清楚,反正我試了好多次才明白的。
    首先,考慮特殊情況:
         1>兩個字串都為空,返回true
         2>當第一個字串不空,而第二個字串空了,返回false(因為這樣,就無法
            匹配成功了,而如果第一個字串空了,第二個字串非空,還是可能匹配成
            功的,比如第二個字串是“a*a*a*a*”,由於‘*’之前的元素可以出現0次,
            所以有可能匹配成功)
    之後就開始匹配第一個字元,這裡有兩種可能:匹配成功或匹配失敗。但考慮到pattern
    下一個字元可能是‘*’, 這裡我們分兩種情況討論:pattern下一個字元為‘*’或
    不為‘*’:(下面的1>和2>結合上面的思路看!)
          1>pattern下一個字元不為‘*’:這種情況比較簡單,直接匹配當前字元。如果
            匹配成功,繼續匹配下一個;如果匹配失敗,直接返回false。注意這裡的
            “匹配成功”,除了兩個字元相同的情況外,還有一種情況,就是pattern的
            當前字元為‘.’,同時str的當前字元不為‘\0’。
          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 == '\0' && *pattern == '\0') return true; if (*str != '\0' && *pattern == '\0') return false; //if the next character in pattern is not '*' if (*(pattern+1
) != '*') { if (*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str+1, pattern+1); else return false; } //if the next character is '*' else { if (*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str, pattern+2) || match(str+1, pattern); //剛開始一直不懂為何要返回match(str, pattern+2)的值,原因在於'*'可以匹配0個字元 //即使是當前字元匹配,也存在匹配0個字元的情況 else return match(str, pattern+2); } } };