题意
题目描述
请实现一个函数用来匹配包括’.’和”的正则表达式。模式中的字符’.’表示任意一个字符,而”表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配
样例输入
“a”,”ab*a”
样例输出
false
思路
1当字符串和模式串同时变为空的时候,匹配成功。返回true
* 2当字符串不为空,模式串为空的时候,匹配不成功。返回false
* 3当字符串为空,模式串不为空的时候,可能匹配成功。因为*代表0次或多次。
*
* 当模式串下一个字符不为*的时候
* 1直接比较字符串和模式串的第一个字符,如果相等,字符串和模式串同时后移一位。
* 2接着比较,相等。重复1.不相等直接返回false
*
* 当模式串下一个字符为*的时候 且匹配成功
* 1字符串不移位,模式串后移两位(*表示出现0次的时候)
* 2字符串移动一位,模式串后移两位(*表示出现1次的时候)
* 3字符串后移一位,模式串不动(*表示出现超过2次的时候)
* 当模式串下一个字符为*的时候 且匹配不成功 字符串后移一位,模式串后移两位,X*,跳过*
*
代码
package regex;
/**
* 请实现一个函数用来匹配包括'.'和''的正则表达式。 模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。
* 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配, 但是与"aa.a"和"ab*a"均不匹配
*
* @author Administrator
* 思路:
* 1当字符串和模式串同时变为空的时候,匹配成功。返回true
* 2当字符串不为空,模式串为空的时候,匹配不成功。返回false
* 3当字符串为空,模式串不为空的时候,可能匹配成功。因为*代表0次或多次。
*
* 当模式串下一个字符不为*的时候
* 1直接比较字符串和模式串的第一个字符,如果相等,字符串和模式串同时后移一位。
* 2接着比较,相等。重复1.不相等直接返回false
*
* 当模式串下一个字符为*的时候 且匹配成功
* 1字符串不移位,模式串后移两位(*表示出现0次的时候)
* 2字符串移动一位,模式串后移两位(*表示出现1次的时候)
* 3字符串后移一位,模式串不动(*表示出现超过2次的时候)
*
*
* 当模式串下一个字符为*的时候 且匹配不成功 字符串后移一位,模式串后移两位,X*,跳过*
*
*/
public class Match {
public static void main(String[] args) {
char[] str={' '};
char[] pattern={'.','*'};
Solution s=new Solution();
System.out.println(s.match(str,pattern));
}
}
class Solution {
public boolean match(char[] str, char[] pattern) {
if(str==null||pattern==null){
return false;
}
return matchTo(str,0, pattern,0);
}
public boolean matchTo(char[] str,int strIndex ,char[] pattern,int patternIndex) {
//int strIndex=0;
//int patternIndex=0;
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)&&str[strIndex]==pattern[patternIndex]||(pattern[patternIndex]=='.'&&(strIndex!=str.length))){
return matchTo(str,strIndex, pattern,patternIndex+2)//模式串后移两位,匹配0位
||matchTo(str,strIndex+1, pattern,patternIndex+2)//字符串后移一位,模式串后移两位,匹配1位
||matchTo(str,strIndex+1, pattern,patternIndex);//匹配超过一位
}else
return matchTo(str,strIndex, pattern,patternIndex+2);
} //模式串下一个字符不为*
if((strIndex!=str.length)&&str[strIndex]==pattern[patternIndex]||(pattern[patternIndex]=='.'&&(strIndex!=str.length))){
return matchTo(str,strIndex+1, pattern,patternIndex+1);//匹配成功
}
return false;//匹配不成功
}
}