首先,考慮特殊情況:
1>兩個字符串都爲空,返回true
2>當第一個字符串不空,而第二個字符串空了,返回false(因爲這樣,就無法
匹配成功了,而如果第一個字符串空了,第二個字符串非空,還是可能匹配成
功的,比如第二個字符串是“a*a*a*a*”,由於‘*’之前的元素可以出現0次,
所以有可能匹配成功)
之後就開始匹配第一個字符,這裏有兩種可能:匹配成功或匹配失敗。但考慮到pattern
下一個字符可能是‘*’, 這裏我們分兩種情況討論:pattern下一個字符爲‘*’或
不爲‘*’:
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);
else
return match(str, pattern+2);
}
}
};