'。'をサポートする正規表現マッチングを実装します。と '*'。
'。' 任意の1文字に一致します。'*'前の要素の0個以上に一致します。マッチングは、入力文字列全体(部分的ではない)をカバーする必要があります。
いくつかの例:
isMatch(“ aa”、” a”)→false
isMatch(“ aa”、” aa”)→true
isMatch(“ aaa”、” aa”)→false
isMatch(“ aa”、“ a *”)→true
isMatch(“ aa”、“。*”)→true
isMatch(“ ab”、“。*”)→true
isMatch(“ aab”、“ c * a * b”)→true
著者は次の解決策を示していますが、これは本当に美しいです。
bool isMatch(const char *s, const char *p) {
assert(s && p);
if (*p == '\0') return *s == '\0';
// next char is not '*': must match current character
if (*(p+1) != '*') {
assert(*p != '*');
return ((*p == *s) || (*p == '.' && *s != '\0')) && isMatch(s+1, p+1);
}
// next char is '*'
while ((*p == *s) || (*p == '.' && *s != '\0')) {
if (isMatch(s, p+2)) return true;
s++;
}
return isMatch(s, p+2);
}
著者はまた、いくつかのさらなる考えを与えます:
注意深く考えると、上記のコードが指数関数的に複雑に実行される場合があります。
いくつかの例を考えていただけますか?上記のコードをより効率的にするにはどうすればよいですか?
文字列sとpの長さがそれほど大きくないのに、結果を得るのに長い時間がかかるケースを1つ思いつきました。
s [] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" p [] = "a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * b "
誰かが私がこの答えを確認するのを手伝ってもらえますか?この種の極端なテストの質問を見つけることをどのように考えるのですか?