52、正则表达式匹配(medium)

链接:https://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c?tpId=13&tqId=11205&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
来源:牛客网

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

这题对我来说至少是medium级别了,特别是第一次尝试做的时候,真是写不出来。
有个关键点就是要先处理下一个字符是星号的情况,如果遇到两个字符相同或pattern的字符是.(点号)就直接处理下一个字符的话,显然是不对的。比如 aaa,pattern是a*a,如果两个串都去掉第一个a,变成aa和*a就没法继续判断了。

public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        return match(str,0,pattern,0);
    }
    
    public boolean match(char[] str, int i, char[] pattern, int j){
        // 匹配串和模式串都到达末尾,匹配成功
        if(i>=str.length&&j>=pattern.length){
            return true;
        }
        
        // 匹配串未到末尾,模式串到达末尾,说明匹配失败
        if (i != str.length && j >= pattern.length) {
            return false;
        }
        
        //模式串未到末尾,匹配串可能到末尾也可能没到
        // 下一个模式符是*
        if(j+1= str.length) {
                return match(str, i, pattern, j + 2);
            }
            
            // 匹配串未结束
            if(str[i]==pattern[j]||pattern[j]=='.'){
                    // 匹配0个
                return match(str,i,pattern,j+2)|| 
                    // 匹配1个
                    match(str,i+1,pattern,j+2)||
                    // 匹配多个
                    match(str,i+1,pattern,j);
            }else{
                return match(str, i, pattern, j + 2);
            }       
        }
        
        // 匹配串已结束
        if(i>=str.length){
            return false;
        }
        // 匹配串未结束
        else if(str[i]==pattern[j]||pattern[j]=='.'){
            return match(str,i+1,pattern,j+1);
        }
        
        return false;
    }
}

你可能感兴趣的:(52、正则表达式匹配(medium))