タイトルの説明
'。'およびを含む
'*'
正規表現に一致する関数を実装してください。パターン内の文字「。」は任意の文字を表し、'*'
その前の文字は何度でも(0回を含めて)出現できます。この質問では、一致とは、文字列のすべての文字がパターン全体と一致することを意味します。たとえば、文字列「aaa」は、パターン「aa」および「ab ac a」に一致しますが、「aa.a」および「ab * a」には一致しません。
問題解決のアイデア
2つのケースがあります。式の次の文字が'*'
- パターンの次の文字は異なります
‘*’
。このケースは比較的単純で、現在の文字に直接一致します。
マッチが成功した場合は、次のマッチを続行し、マッチが失敗した場合は、直接falseを返します。なお、ここでの
「マッチング成功」は、2文字が同じ場合のほか
、パターンの現在の文字が「。」である場合や、strの現在の文字が「\ 0」でない場合があります。 - 次の文字パターン
‘*’
、「*」0を表現する以上のことができますので、もう少し複雑。
これらすべての状況がここで考慮されます:‘*’
0文字に一致する場合、strの現在の文字は変更されず、patternの現在の文字は2ビットシフトされ、
この‘*’
記号はスキップされます。- 場合
‘*’
低級シンボル、パターン、現在の文字に向かって一つ以上の、STR電流整合
不変です。(ここで1つ以上一致する場合は、ケースと見なすことができます。1つに一致する場合、
strは次の文字に移動し、パターン文字は変更されないため、大文字の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;
//如果表达式的下一个字符不是*
//正常处理
//判断当前是否相等或者只要表达式为.并且匹配的字符串不为空
//然后返回str+,pattern+1判断下一个
if(*(pattern+1) != '*'){
if(*str == *pattern || *str != '\0'&& *pattern == '.')
return match(str+1,pattern+1);
else
return false;
}
//否则下一个字符为'*'
else{
if(*str == *pattern || *str!= '\0' && *pattern == '.')
return match(str,pattern+2)|| match(str+1,pattern);
else
return match(str,pattern+2);
}
}
};