题目
请实现一个函数用来匹配包括'.'和'*'的正则表达式。
- 模式中的字符'.'表示任意一个字符。
- 模式中的字符'*'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
数据范围:
- str 只包含从 a-z 的小写字母。
- pattern 只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。
- 0≤str.length≤26
- 0≤pattern.length≤26
示例1
输入:
"aaa","a*a"
返回值:
true
说明:
中间的*可以出现任意次的a,所以可以出现1次a,能匹配上。
示例2
输入:
"aad","c*a*d"
返回值:
true
说明:
因为这里 c 为 0 个,a被重复一次, * 表示零个或多个a。因此可以匹配字符串 "aad"。
示例3
输入:
"a",".*"
返回值:
true
说明:
".*" 表示可匹配零个或多个('*')任意字符('.')
示例4
输入:
"aaab","a*a*a*c"
返回值:
false
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
public boolean match (String str, String pattern) {
//1.创建dp表
int m = str.length(), n = pattern.length();
boolean[][] dp = new boolean[m + 1][n + 1];
//2.初始化
str = " " + str;
pattern = " " + pattern;
char[] s = str.toCharArray();
char[] p = pattern.toCharArray();
dp[0][0] = true;
for(int j = 2; j <= n; j += 2) {
if(p[j] == '*') {
dp[0][j] = true;
} else {
break;
}
}
//3.填表
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(p[j] == '*') {
dp[i][j] = dp[i][j - 2] || (p[j - 1] == '.' || p[j - 1] == s[i]) && dp[i - 1][j];
} else {
dp[i][j] = (p[j] == '.' || p[j] == s[i]) && dp[i - 1][j - 1];
}
}
}
//4.返回值
return dp[m][n];
}
}