192. 通配符匹配-2

192. 通配符匹配
 

判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:

    '?' 可以匹配任何单个字符。
    '*' 可以匹配任意字符串(包括空字符串)。

两个串完全匹配才算匹配成功。
样例

样例1

输入:
"aa"
"a"
输出: false

输出2

输入:
"aa"
"aa"
输出: true

输出3

输入:
"aaa"
"aa"
输出: false

输出4

输入:
"aa"
"*"
输出: true
说明: '*' 可以替换任何字符串

输出5

输入:
"aa"
"a*"
输出: true

样例6

输入:
"ab"
"?*"
输出: true
说明: '?' -> 'a' '*' -> 'b'

样例7

输入:
"aab"
"c*a*b"
输出: false

注意事项

1<=|s|, |p| <= 1000
s仅包含小写英文字母
p包含小写英文字母,?和 *

 

 bool isMatch(string &s, string &p) {

        // write your code here

            int sSize = s.size();

    int pSize = p.size();



 

    if (sSize == 0)

    {

        if (pSize == 0)

        {

            return true;

        }

        int i = 0;

        while (p[i] == '*')

        {

            i++;

        }

        if (i < pSize)

        {

            return false;

        }

        return true;

    }


 

    vector<vector<bool>> dp = vector<vector<bool>>(pSize + 1, vector<bool>(sSize + 1, false));

 

    //第一行,特殊处理

    if (pSize > 0)

    {

        if (p[0] == '*')

        {

            for (int j = 0; j < sSize + 1; j++)

            {

                dp[0][j] = true;

            }

        }

        else if ('?' == p[0])

        {

            dp[0][0] = true;

        }

        else

        {

            for (int j = 0; j < sSize + 1; j++)

            {

                if (s[j] == p[0])

                {

                    dp[0][j] = true;

                    break;

                }

            }

        }

        

    }

 

    for (int i = 1; i < pSize + 1; i++)

    {

        bool bFind = false;//上一行是否出现 true

        if ('*' == p[i])

        {

            for (int j = 0; j < sSize + 1; j++)

            {

                if (false == bFind && dp[i - 1][j] == true)

                {

                    bFind = true;

                }

                if (true == bFind)

                {

                    dp[i][j] = true;//后面全部是true

                }

            }

        }

        else if ('?' == p[i])

        {

            if ('*' == p[i - 1])

            {

                if (true == dp[i - 1][0]) //第一列

                {

                    dp[i][0] = true;//后面全部是true

                }

            }

            for (int j = 1; j < sSize + 1; j++)//从第二列开始

            {

                if (j-1>= 0 && true == dp[i - 1][j - 1]) //斜角上

                {

                    dp[i][j] = true;

                }       

            }

        }

        else

        {

            for (int j = 0; j < sSize + 1; j++)

            {

                if (p[i] == s[j])//字符全匹配

                {

                    if (j-1>= 0 && true == dp[i - 1][j - 1]) //斜角上

                    {

                        dp[i][j] = true;

                    }

                }   

            }

        }   

    }

     

    return dp[pSize][sSize];

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值