題意
請實現一個函數用來匹配包括’.‘和’*‘的正則表達式。模式中的字符’.'表示任意一個字符,而‘*’表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配。題意說這是什麼非確定有限狀態機。不就是一堆小圈圈和剪頭嗎,不知道爲啥這麼高級的名字。
代碼
bool match(char *str, char *pattern) {
bool is_match = false;
//都等於0說明比較完了,正確
if (*str == 0 && *pattern == 0)
return true;
//如果原句不空,pattern沒了,那肯定不對
if (*str != 0 && *pattern == 0)
return false;
if (*(pattern + 1) == '*') {
//當前和*之前的字符相同,或者pattern是.的時候
if (*pattern == *str || *str != 0 && *pattern == '.')
is_match = match(str + 1, pattern) ||//可以讓下一個字符和*之前的字符繼續比(代表着*之前是n>1次)
match(str, pattern + 2) || //可以跳過這個*的字符,對pattern的下一個字符比較(代表着*之前是0次)
match(str + 1, pattern + 2); // 可以跳過這個字符並且跳過這個pattern比較(代表*之前是1次),這個條件實際上可以去掉
else //不相同就直接跳過這個*的字符
is_match = match(str , pattern+2);
} else if (*str == *pattern || *pattern == '.' && *str != 0) {
//如果不是*的話就比這個字符就可以了
is_match = match(str + 1, pattern + 1);
}
return is_match;
}