JZ52 --- 正则表达式匹配

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

题解:
设置指针 i ,指针 j 分别指向 str数组 和 pattern数组。

  1. 当前 i,j 所指向的元素相等,两指针全都向后移。
  2. 当前 j 指向的元素为 ’ . ',两指针全都向后移。
  3. 如果 j + 1 指向的是 ‘ * ’
    (1)当前 i,j 指向不同,那就把 ‘ * ’ 前面的字符理解出现了0次,i不动,j+2。
    (2)当前 i,j 指向相同,则会有以下三种情况
    —(a)理解为 ‘ * ’ 前面的字符出现了0次,则 i不动,j+2
    —(b)理解为 ‘ * ’ 前面的字符出现了一次,则 i+1,j+2
    —(c)理解为 ‘ * ’ 前面的字符出现了多次,则 i+1,j不动
public static boolean match(char[] str, char[] pattern){
    if(str.length == 0 && pattern.length == 0){
        return true;
    }
    if(pattern.length == 0){
        return false;
    }
    return matchExpression(str,0,pattern,0);
}
public static boolean matchExpression(char[] str,int i,char[] pat,int j){
    if (i == str.length && j == pat.length) { // 字符串和模式串都为空
        return true;
    } else if (j == pat.length) { // 模式串为空
        return false;
    }
    if (j + 1 < pat.length && pat[j + 1] == '*') {
        //出现了*,并且i和j指向的相同,3种情况并列
        if ((i < str.length && pat[j] == '.')
                || (i < str.length && pat[j] == str[i])) {
            return matchExpression (str, i, pat, j + 2)
                    || matchExpression (str,  i + 1, pat, j)
                    || matchExpression (str,  i + 1, pat, j + 2);
        } else {
        	//出现了*,并且i和j指向的不同,那就把*前面的字符理解出现了0次,p+2
            return matchExpression (str, i, pat, j + 2);
        }
    }
    if(i < str.length && (str[i] == pat[j] || pat[j] == '.')){
        return matchExpression (str,i+1,pat,j+1);
    }
    return false;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值