请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
剑指 Offer 19. 正则表达式匹配 - 力扣(LeetCode) (leetcode-cn.com)。
思路:假设字符串s当前下标为i,模式串p当前下标为j,
当p[j + 1] != '*'时, 如果s[i] = p[j],i++,j++,继续进行匹配,s[i] != p[j]就直接返回false;
假如p[j + 1] = '*', 如果s[i] = p[j],i++,j可以不变,也可以加2,继续进行匹配,如果s[i] != p[j],i不变,j加2.
//递归
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
if(s == null && p == null){
return true;
}
if(s != null && p == null){
return false;
}
return match(s, p, 0, 0);
}
public boolean match(String s, String p, int i, int j){
if( i == s.length() && j == p.length()){
return true;
}
if(i < s.length() && j == p.length()){
return false;
}
if(j < p.length() - 1 && p.charAt(j + 1) == '*'){
if(i < s.length() && (s.charAt(i) == p.charAt(j) || (p.charAt(j) == '.'))){
return match(s, p, i + 1, j + 2) || match(s, p, i + 1, j) || match(s, p, i, j + 2);
}else{
return match(s, p, i, j + 2);
}
}
if(i < s.length() && (s.charAt(i) == p.charAt(j) || (p.charAt(j) == '.'))){
return match(s, p, i + 1, j + 1);
}
return false;
}
}
//动态规划
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
boolean[][] f = new boolean[m + 1][n + 1];
f[0][0] = true;
for(int i = 0; i <= m; i++){
for(int j = 1; j <= n; j++){
if( p.charAt(j - 1) == '*'){
if(i > 0 && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.')){
f[i][j] = f[i - 1][j];
}
f[i][j] |= f[i][j - 2];
}else{
if( i > 0 && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.')){
f[i][j] = f[i - 1][j - 1];
}
}
}
}
return f[m][n];
}
}