牛客网刷题之正则表达式匹配

来源:互联网 发布:郑州做软件开发 编辑:程序博客网 时间:2024/05/21 14:57

题目描述:

这里写图片描述

解题思路:

归根到底,该题大体上分为两种情况,而两种情况里面还得细分。

当匹配字符串中下一个字符不是”*”:
如果目标字符串的前一个字符和匹配字符串的前一个字符匹配,那么两个字符串都下移一位,否则返回false;
当匹配字符串中下一个字符是”*”:
如果目标字符串的前一位字符和匹配字符串的前一位字符不匹配,那么匹配字符串要后移两位,相当于要跳过“×”;
如果目标字符串的前一个字符和匹配字符串的前一个字符匹配,那么又可以细分取0,取1,*>=2三种情况。
*取0对应跳过当前匹配位,继续寻找patter的下一个匹配位,str不变,pattern+2
*取1对应当前匹配位算一次成功匹配,str+1,pattern+2
*取>=2对应一次成功匹配,继续匹配字符串的下一位是否匹配,str+1,pattern不变
三者取或。即只要有一种情况能匹配成功认为字符串就是匹配成功的。
匹配成功的标志的目标字符串和匹配字符串都到达末端。

题解:

    public boolean match(char[] str, char[] pattern) {        if (str == null || pattern == null) {            return false;        }        return matchStr(str, 0, pattern, 0);    }    public boolean matchStr(char[] str, int strIndex, char[] pattern,int patternIndex) {        if (strIndex == str.length && patternIndex == pattern.length) {            return true;        }        if (strIndex != str.length && patternIndex == pattern.length) {            return false;        }        // 匹配字符串下一个是*        if (patternIndex + 1 < pattern.length                && pattern[patternIndex + 1] == '*') {            if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])                    || (strIndex != str.length && pattern[patternIndex] == '.' )) {                return matchStr(str, strIndex, pattern, patternIndex + 2)//*匹配0个字符                        || matchStr(str, strIndex + 1, pattern,patternIndex + 2)// 匹配1个字符                        || matchStr(str, strIndex + 1, pattern, patternIndex);// *匹配1个,再匹配str中的下一个            } else {                return matchStr(str, strIndex, pattern, patternIndex + 2);            }        }        // 匹配字符串下一个不是*        if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])                || (strIndex != str.length && pattern[patternIndex] == '.' )) {            return matchStr(str, strIndex + 1, pattern, patternIndex + 1);        }        return false;    }

ac结果:

这里写图片描述

0 0
原创粉丝点击