您的位置:首页 > Web前端

剑指offer-正则表达式匹配-java

2018-03-29 15:45 375 查看
题目描述:

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路解析:
递归方法,参数有两个char数组,还有int类型的下标
如果两个下标刚好等于两个char数组长度,返回true
如果模式串先结束,则返回false
如果模式串的下一个字符是‘*’,
字符串的下标小于字符串的长度之中,并且,当前的字符都相等,或者,下一个模式字符是‘.’(如果是‘.’,什么字符都行所以也不用和str里面对应相等)的话,会出现三种情况:
(1)*代表0次:模式串向后移动两位
(2)*代表1次:模式串向后移动两位,字符串向后移动一位
(3)*代表2次:模式串不变,字符串向后移动一位。
当前的字符不相等,*代表0次,模式串向后移动两位
如果字符串的下标不小于字符串长度,返回false(决定了""和".*"匹配)
还有在没有‘*’的时候,只有字符匹配成功,或者模式串是'.':各向后移一位。
代码:public class Solution {
public boolean match(char[] str, char[] pattern){
return isMatch(str,0,pattern,0);
}
public boolean isMatch(char[] str,int strIndex,char[] pattern,int patternIndex){
if(strIndex==str.length && patternIndex == pattern.length)
return true;
if(patternIndex>=pattern.length)
return false;
if(patternIndex<pattern.length-1){
if(pattern[patternIndex+1]=='*'){
if((strIndex<str.length)&&(str[strIndex]==pattern[patternIndex]||pattern[patternIndex]=='.')){
return isMatch(str,strIndex,pattern,patternIndex+2)||
isMatch(str,strIndex+1,pattern,patternIndex+2)||
isMatch(str,strIndex+1,pattern,patternIndex);
}else{
return isMatch(str,strIndex,pattern,patternIndex+2);
}
}
}
if(strIndex>=str.length)
return false;
if(str[strIndex]==pattern[patternIndex]||pattern[patternIndex]=='.'){
return isMatch(str,strIndex+1,pattern,patternIndex+1);
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: