154. 正则表达式匹配

154. 正则表达式匹配
 

实现支持'.'和'*'的正则表达式匹配。

'.'匹配任意一个字母。

'*'匹配零个或者多个前面的元素。

匹配应该覆盖整个输入字符串,而不仅仅是一部分。

需要实现的函数是:bool isMatch(string s, string p)

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
样例

样例 1:

输入:"aa","a"
输出:false
解释:
无法匹配

样例 2:

输入:"aa","a*"
输出:true
解释:
'*' 可以重复 a

bool isMatch(string &s, string &p)
{
    // write your code here
    int srcLen = s.size();
    int dstLen = p.size();

    int i = 0;
    int j = 0;

    while (i < srcLen)
    {

        char aa = s[i];
        char bb = p[j];

        if (p[j] == '.' && p[j + 1] == '*' && dstLen == 2)
        {
            return true;

        }
        else if (j+2 < dstLen && p[j] == '.' && p[j + 1] == '*'  && srcLen == 2 && dstLen > 2 &&  p[j + 2] != '*')
        {
            return false;

        }
        else if (p[j] == '.' && p[j + 1] == '*')
        {
            if (s[i] == s[i + 1])
            {
                while (s[i] == s[i + 1])
                {
                    i++;
                }
                i++;
                j = j + 2;
            }
            else if(s[i] != s[i + 1] && s[i] != p[j+2])
            {
                j = j + 2;
                i = i + 1;
            }
            else
            {
                j = j + 2; //把 .* 当作 0处理
            }
        }
        else if (p[j] == '.')
        {
            i++;
            j++;
        }
        else if (s[i] != p[j] && j+1 < dstLen &&  p[j + 1] == '*')
        {
            j = j + 2;
        }
        else if (j == dstLen - 1 && i != srcLen - 1 && p[j ] != '*')
        {
            return false;
        }
        else if (j != dstLen - 1 && i == srcLen - 1)
        {
            if (j + 1 < dstLen)
            {
                while (j + 1 < dstLen && p[j + 1] == '*')
                {
                    j = j + 2;
                }
                if (p[j] == s[i])
                {
                    return true;
                }
            }
        }
        else if (s[i] == p[j])
        {
            i++;
            j++;
        }
        else if (j == dstLen - 1 && i == srcLen - 1 && s[i] != p[j] && p[j] != '*' && p[j] != '.')
        {
            return false;
        }
        else if (i == srcLen)
        {
            if (p[j] == '*')
            {
                if (p[j - 1] == p[j + 1])
                {
                    if (j + 1 == dstLen - 1)
                    {
                        return true;
                    }
                }
            }
        }
        else if (p[j] == '*')
        {
            if (s[i] == s[i - 1])
            {
                while (i+1 < srcLen && s[i] == s[i + 1])
                {
                    i++;
                }
                i++;
                j++;
            }
            else if (j + 1 < dstLen) //把 * 前面当作 0 个
            {
                j = j + 1;
            }
            else if (p[j + 1] != s[i - 1])
            {
                return false;
            }
            else
            {
                j = j + 1;
            }
        }
        else
        {
            return false;
        }


    }

    if (j < dstLen - 1)
    {
        return false;
    }

    return true;
}


void test()
{
    /*
    string s = "aaaab";
    string p="a*a*a*a*c";*/


    //string s = "aa";
    //string p = "a*";

    //string s = "bbabacccbcbbcaaab";
    //string p = "a*b*a*a*c*aa*c*bc*";

    /*string s = "ab";
    string p = ".*c";
*/

    //string s = "bbbba";
    //string p = ".*a*a";


    //string s = "acaabbaccbbacaabbbb";
    //string p = "a*.*b*.*a*aa*a*";


    string s = "aasdfasdfasdfasdfas";
    string p = "aasdf.*asdf.*asdf.*asdf.*s";

    bool ret =  isMatch(s, p);

}

猜你喜欢

转载自blog.csdn.net/yinhua405/article/details/110622122