剑指offer第2版19题:正则表达式匹配

小渣渣的算法学习笔记:2018秋招备战


数据结构类算法总结:字符串



1.题目描述:

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

2.代码实现:

public class Solution19 {

    public static void main(String[] args) {
        Solution19 s = new Solution19();
        String str = "aaa";
        String pat = "ab*ac*a";
        char[] ctr = str.toCharArray();
        char[] cat = pat.toCharArray();
        boolean b = s.match(ctr,cat);
        System.out.println(b);
    }

    public boolean match(char[] str,char[] pattern){
        return matchCore(str,0,str.length,pattern,0,pattern.length);
    }

    public boolean matchCore(char[] str,int i,int length1,
                             char[] pattern,int j,int length2){
        //1.最终结束条件:目标串和模式串都扫描到结尾
        if(i==length1 && j==length2) return true;
        //2.目标串到达结尾&&模式串未达到结尾
        if(i==length1 && j!=length2){
            while(j!=length2){
                if(pattern[j]!='*'&&(j+1>=length2||pattern[j+1]!='*')){
                    return false;
                }
                j++;
            }
            return true;
        }
        //3.目标串未达到结尾&&模式串已到达结尾
        if(i!=length1 && j==length2) return false;
        //4.模式串+1到达结尾
        if(j+1==length2){
            if(str[i] == pattern[j] || pattern[j] == '.'){
                return matchCore(str,i+1,str.length,pattern,j+1,pattern.length);
            }else{
                return false;
            }
        }
        //5.模式串匹配 模式串下一个位置不为*
        if((str[i] == pattern[j] || pattern[j] == '.')&& pattern[j+1] != '*'){
            return matchCore(str,i+1,str.length,pattern,j+1,pattern.length);
        }
        //6.模式串匹配 模式串下一个位置为*
        if((str[i] == pattern[j] || pattern[j] == '.')&& pattern[j+1] == '*'){
            return matchCore(str,i,str.length,pattern,j+2,pattern.length)
                    || matchCore(str,i+1,str.length,pattern,j,pattern.length);
        }
        //7.模式串+1 结尾为*
        if(pattern[j+1] == '*'){
            return matchCore(str,i,str.length,pattern,j+2,pattern.length);
        }

        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42561115/article/details/80945420
今日推荐