您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页剑指:正则表达式匹配

剑指:正则表达式匹配

来源:测品娱乐

题目描述

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含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头。

 

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:动态规划

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务