剑指offer 正则表达式匹配

题目

请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

思路 (动态规划)

  1. 建立dp[i][j]数组 代表是str前i个能否被pattern[j]个匹配

  2. 首先初始化dp数组的第一行,当前是与空字符串匹配。
    2.1 首先想到两个都是空的时候,是匹配的,dp[0][0]=true;
    2.2 若pattern不为空,则分类讨论

    1. 若pattern[j] !=’ * ',一定是不匹配的
    2. 若pattern[j] == ’ * ',那么就存在p[j-1]p[j]这两个模式串使用0次,也可以匹配。 如a* 则可以等于“ ”,所以可以匹配。
  3. 开始比较str和pattern字符串
    3.1 若pattern[j] == ‘.’||pattern[j]== str[i]:当前匹配成功
    3.2 如果p[j] == ‘*’:需要进一步分情况讨论。

    1. 若pattern== '.'或者pattern[j-1] == str[i],则pattern[j-1]pattern[j]这两个模式串可以使用1到无数次,匹配成功
    2. 若pattern[j-1] != '.'和pattern[j-1] != s[i]的时候,但可以使用p[j-1]p[j]这两个模式串0次,匹配成功

除了以上情况,均匹配不成功

public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        boolean dp[][]= new boolean [str.length+1][pattern.length+1];
        dp[0][0]=true;
        for(int i=0;i<pattern.length;i++)
            if(i>0&&pattern[i]=='*')
                dp[0][i+1]=dp[0][i-1];
        for(int i=0;i<str.length;i++){
            for(int j=0;j<pattern.length;j++){
                if(str[i]==pattern[j]||pattern[j]=='.')
                    dp[i+1][j+1]=dp[i][j];
                if(pattern[j]=='*')
                {
                    if(pattern[j-1]!=str[i]&&pattern[j-1]!='.')
                        dp[i+1][j+1]=dp[i+1][j-1];
                    else
                        dp[i+1][j+1]=dp[i][j+1]||dp[i+1][j]||dp[i+1][j-1];
                }
            }
        }
        return dp[str.length][pattern.length];
    }
}

其他的题题解
剑指offer题解 java版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值