LintCode第192题-通配符匹配

描述

给定一个字符串 s 和一个字符模式 p ,实现一个支持 '?' 和 '*' 的通配符匹配。匹配规则如下:

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

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

样例

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

思路:

难点在于该题的初始化 转移方程 

初始化:

dp[0][j]=dp[0][j-1];

转移方程:

匹配分为3部分 普通字符匹配 ?匹配 *匹配 

//如果是普通匹配 那么就是

dp[i][j]=dp[i-1][j-1];

//如果是p的字符是?情况的匹配

dp[i][j]=dp[i-1][j-1];

//如果是p的字符是*的情况下的匹配

dp[i][j]=dp[i][j-1] || dp[i-1] [j];

dp[i][j]=dp[i][j-1]用于s是空字符串 p是*的情况

dp[i][j]=dp[i-1] [j];//这个就是当p[j]为字符*的时候 * 可以不匹配任何字符,只是“存在但不参与匹配” 所以选择忽略掉

常见错误:

1.

 boolean[][] dp=new boolean[m][n];

正确的应该是 boolean[][] dp=new boolean[m+1][n+1]因为多开一维来处理“前 i 个字符”概念,包括空串情况

2.

scharacter==pcharacter|| pcharacter == '?'

pcharacter == '?'很容易被遗漏掉

pcharacter == '?' 是 必须加的判断条件,因为它能让 ? 正确地匹配任意单个字符

代码如下:

public class Solution {

    public boolean isMatch(String s, String p) {

        int m = s.length();

        int n = p.length();

        boolean[][] dp=new boolean[m+1][n+1];

        dp[0][0]=true;//空串匹配空串

        //初始化

        for(int j=1;j<=n;j++)

        {

            if(p.charAt(j-1)=='*')

            {

                dp[0][j]=dp[0][j-1];//// 继承上一个状态

            }else {
                break; // 一旦不是 *,后面都不可能匹配空串了
                    }

        }

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

        {

            for(int j=1;j<=n;j++)

            {

                char scharacter=s.charAt(i-1);

                char pcharacter=p.charAt(j-1);

                if(scharacter==pcharacter|| pcharacter == '?')

                {

                    dp[i][j]=dp[i-1][j-1];

                }else if(pcharacter=='*')

                {

                    dp[i][j] = dp[i][j - 1] || dp[i - 1][j];

                }else

                {

                    dp[i][j]=false;

                }

            }

        }

        return dp[m][n];

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值