[ソードフィンガーオファー] _17正規表現マッチング

タイトルの説明

'。'およびを含む'*'正規表現に一致する関数を実装してくださいパターン内の文字「。」は任意の文字を表し、'*'その前の文字は何度でも(0回を含めて)出現できます。この質問では、一致とは、文字列のすべての文字がパターン全体と一致することを意味します。たとえば、文字列「aaa」は、パターン「aa」および「ab ac a」に一致しますが、「aa.a」および「ab * a」には一致しません。

問題解決のアイデア

2つのケースがあります。式の次の文字が'*'

  1. パターンの次の文字は異なります‘*’。このケースは比較的単純で、現在の文字に直接一致します。
    マッチが成功した場合は、次のマッチを続行し、マッチが失敗した場合は、直接falseを返します。なお、ここでの
    「マッチング成功」は、2文字が同じ場合のほか
    パターンの現在の文字が「。」である場合や、strの現在の文字が「\ 0」でない場合があります。
  2. 次の文字パターン‘*’、「*」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);
        }
           
    }
};
253件の元の記事を公開しました 賞賛されました41 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/liuyuchen282828/article/details/104080409