题目描述:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
数据范围:
1.str 可能为空,且只包含从 a-z 的小写字母。
2.pattern 可能为空,且只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。
3.1 <= str.length <= 20
4.1 <= pattern.length <= 30
要求:空间复杂度 O(1),时间复杂度 O(n)
示例1
输入:"aaa","a*a"
返回值:true
说明:中间的*可以出现任意次的a,所以可以出现1次a,能匹配上
示例2
输入:"aad","c*a*d"
返回值:true
说明:因为这里 c 为 0 个,a被重复一次, * 表示零个或多个a。因此可以匹配字符串 "aad"。
示例3
输入:"",".*"
返回值:true
说明:".*" 表示可匹配零个或多个('*')任意字符('.')
示例4
输入:"aaab","a*a*a*c"
返回值:false
解法:
思路:
1、当模式中的第二个字符不是“*”时:
(1)如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
(2)如果字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。
2、当模式中的第二个字符是“*”时:
(1)如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。
(2)如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式:
- 模式后移2字符,相当于x*被忽略;
- 字符串后移1字符,模式后移2字符; 相当于x*算一次
- 符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位,相当于算多次
代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
public boolean match (String str, String pattern) {
if(str == null && pattern == null){
return false;
}
//转为字符数组,便于判断
char[] strArray = str.toCharArray();
char[] patternArray = pattern.toCharArray();
return arrayMatch(strArray, patternArray, 0, 0);
}
//匹配检验
public boolean arrayMatch(char[] str, char[] pattern, int strIndex, int patternIndex){
//当两者都遍历结束的时候,说明匹配成功
if (strIndex==str.length && patternIndex==pattern.length) {
return true;
}
//str还未遍历结束,但是pattern已经匹配结束,返回false
if(strIndex!=str.length && patternIndex==pattern.length){
return false;
}
//情况描述
// 模式第2个是*,且字符串第1个跟模式第1个匹配,分3种匹配模式;如不匹配,模式后移2位
if(patternIndex+1<pattern.length && pattern[patternIndex+1]=='*'){
if((strIndex!=str.length && pattern[patternIndex]==str[strIndex])||
(pattern[patternIndex]=='.' && strIndex!=str.length)){
return arrayMatch(str,pattern,strIndex,patternIndex+2)||
arrayMatch(str,pattern,strIndex+1,patternIndex+2)||
arrayMatch(str,pattern,strIndex+1,patternIndex);
}//注意数组越界的检验
else{
return arrayMatch(str,pattern,strIndex,patternIndex+2);
}
}
// 模式第2个不是*,且字符串第1个跟模式第1个匹配,则都后移1位,否则直接返回false
if((strIndex!=str.length && pattern[patternIndex]==str[strIndex]) ||
(pattern[patternIndex]=='.' && strIndex!=str.length)){
return arrayMatch(str,pattern,strIndex+1,patternIndex+1);
}
return false;
}
}