剑指:正则表达式匹配

题目描述

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

思路:

例子一开始都没看懂,仔细看了之后才发现怎么回事。。。

字符串"aaa"与模式"a.a"和"ab*ac*a"匹配:"a.a"中'.'可以代表a,所以"a.a"可以变为"aaa";"ab*ac*a"中'*'前面的字符可以出现0到多次,这个例子中*前面的b和c都出现0次,那么"ab*ac*a"也变成"aaa",所以匹配。

按照上述想法,字符串"aaa"与模式"aa.a"和"ab*a"不匹配,因为"aa.a"和"ab*a"不能变为"aaa"。

两种方法:

方法1:递归

i指向str头,j指向pattern头。

 

  1. i和j匹配,记录匹配的情况:isMatch
  2. j+1是*,则有以下情况:
  3. isMatch && match(str,i+1,pattern,j)//i和j匹配,并且i+1也和j匹配,因为j+1是*,所以j可能有多个
  4. match(str,i,pattern,j+2)//i和j可能匹配也可能不匹配,*前面一个j出现0次,从*后面的一个(j+2)重新匹配
  5. j+1不是*,isMatch && match(str,i+1,pattern,j+1)
public class Solution {
    public boolean match(char[] str, char[] pattern){
        return helpmatch(str, 0, pattern, 0);
    }
	private boolean helpmatch(char[] str,int i, char[] pattern,int j){
        if(j == pattern.length) {//遍历到最后
        	return i == str.length;
        }
        boolean isMatch =(i != str.length) && (str[i] == pattern[j] || pattern[j] == '.');
        if(j<pattern.length-1 && pattern[j+1]=='*') {
        	return (isMatch && (helpmatch(str, i+1, pattern, j)) || helpmatch(str, i, pattern, j+2));
        }else {
        	return isMatch && helpmatch(str, i+1, pattern, j+1);
        }
    }
}

 

方法2:动态规划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值