给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 3:
输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
解题思路分为以下几种情况 i,j代表访问到s,p的位置
* 1.s.charAt(i)==p.charAt(j) dp[i][j] = dp[i-1][j-1] * 2.p.charAt(j) == . dp[i][j] = dp[i-1][j-1] * 3.p.charAt(j) == * * (1). p.charAt(j-1) != s.charAt(i)&&p.charAt(j-1)!=. dp[i][j] = dp[i][j-2] * (2). p.charAt(j-1) == s.charAt(i)||p.charAt(j-1)==. * a. ba* 变成 b dp[i][j-2] * b. ba* 变成 ba dp[i][j-1] * c. ba* 变成 baaa.. dp[i-1][j]
public boolean isMatch(String s, String p) {
int pLength = p.length();
int sLength = s.length();
boolean dp[][] =new boolean[sLength+1][pLength+1];
dp[0][0]=true;
for (int i= 0 ; i<p.length() ;i++)
{
if (p.charAt(i)=='*'&&dp[0][i-1]){
dp[0][i+1] =true;
}
}
for (int i =0 ;i<sLength ; i++){
for (int j =0 ; j<pLength ; j++){
if (s.charAt(i)==p.charAt(j)||p.charAt(j)=='.'){
dp[i+1][j+1] = dp[i][j];
}else if (p.charAt(j)=='*'){
if ( (p.charAt(j-1)!= s.charAt(i))&&(p.charAt(j-1)!='.')){
dp[i+1][j+1] = dp[i+1][j-1];
}else {
dp[i+1][j+1] = dp[i+1][j-1]||dp[i][j+1]||dp[i+1][j];
}
}
}
}
return dp[sLength][pLength];
}