一、剑指offer(53)正则表达式匹配
1./** * 题目描述 * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符, * 而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。 * 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 */
2.分析:分类讨论
递归终止条件:
//递归终止条件一:strIndex和patternIndex同时等于各自数组长度
//递归终止条件二:模式下标patternIndex先到达终点,表示匹配不成功
递归情况分类:
//情况1:pattern[patternIndex+1]=='*',此时分为两种情况:
// 1.1 pattern[patternIndex]==str[strIndex]||pattern[patternIndex]=='.' ,分三种情况,见下文
// 1.1.1 abc a*bc ,模式匹配一个字符
// 1.1.2 aaabc a*bc ,模式匹配多个字符
// 1.1.3 abc a*abc , 模式不匹配字符
// 1.2 pattern[patternIndex]!=str[strIndex],patternIndex + = 2 ,直接跳过当前字符,进行下一轮匹配
//情况2:pattern[patternIndex+1]!='*',但是 pattern[patternIndex]==str[strIndex]||pattern[patternIndex]=='.'
//此时,patternIndex 和 strIndex 都+1
public class Solution {
public boolean match(char[] str, char[] pattern) {
return ismMatch(0,str,0,pattern);
}
private boolean ismMatch(int strIndex,char[]str,int patternIndex ,char[]pattern){
//递归终止条件一:strIndex和patternIndex同时等于各自数组长度
if (strIndex==str.length&&patternIndex==pattern.length){
return true;
}
//递归终止条件二:模式下标patternIndex先到达终点,表示匹配不成功
if (patternIndex==pattern.length){
return false;
}
// 特别注意,永远要判断下标,以防越界!!!
//情况1:pattern[patternIndex+1]=='*',此时分为两种情况:
// 1.1 pattern[patternIndex]==str[strIndex]||pattern[patternIndex]=='.' ,分三种情况,见下文
// 1.2 pattern[patternIndex]!=str[strIndex],patternIndex + = 2 ,直接跳过当前字符,进行下一轮匹配
if (patternIndex+1<pattern.length && pattern[patternIndex+1]=='*'){
// 1.1 分三种情况:
if ((strIndex<str.length) && (pattern[patternIndex]==str[strIndex]||pattern[patternIndex]=='.')){
// 1.1.1 abc a*bc ,模式匹配一个字符
return ismMatch(strIndex+1,str,patternIndex+2,pattern) ||
// 1.1.2 aaabc a*bc ,模式匹配多个字符
ismMatch(strIndex+1,str,patternIndex,pattern) ||
// 1.1.3 abc a*abc , 模式不匹配字符
ismMatch(strIndex,str,patternIndex+2,pattern);
}
// 1.2 aabc b*aabc
else if (patternIndex<pattern.length ){
return ismMatch(strIndex,str,patternIndex+2,pattern);
}
}
//情况2:pattern[patternIndex+1]!='*',但是 pattern[patternIndex]==str[strIndex]||pattern[patternIndex]=='.'
//此时,patternIndex 和 strIndex 都+1
if ((strIndex <str.length)&&(pattern[patternIndex]==str[strIndex]||pattern[patternIndex]=='.')){
return ismMatch(strIndex+1,str,patternIndex+1,pattern);
}
return false;
}
// public static void main(String[] args) {
// char[]a={};
// char[]b={'.','*'};
// Sword52_modal_match s52 =new Sword52_modal_match();
// boolean isMatch = s52.match(a,b);
// System.out.println(isMatch);
// }
}