【重點】劍指offer——面試題53:正則表示式匹配
阿新 • • 發佈:2019-01-09
劍指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);
}
}
};