给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配
https://leetcode-cn.com/problems/regular-expression-matching/
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
示例1:
示例2:
示例3:
示例4:
示例 5:
提示:
Java解法
package sj.shimmer.algorithm.y2021;
/**
* Created by SJ on 2021/3/16.
*/
class D50 {
public static void main(String[] args) {
System.out.println(isMatch("aa", "a"));
System.out.println(isMatch("aa", "a*"));
System.out.println(isMatch("ab", ".*"));
System.out.println(isMatch("aab", "c*a*b"));
System.out.println(isMatch("mississippi", "mis*is*p*."));
System.out.println(isMatch("aa", "aaa"));
System.out.println(isMatch("aaa", "a*a"));
}
public static 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) == '*') {
f[i][j] = f[i][j - 2];
if (matches(s, p, i, j - 1)) {
f[i][j] = f[i][j] || f[i - 1][j];
}
} else {
if (matches(s, p, i, j)) {
f[i][j] = f[i - 1][j - 1];
}
}
}
}
return f[m][n];
}
public static boolean matches(String s, String p, int i, int j) {
if (i == 0) {
return false;
}
if (p.charAt(j - 1) == '.') {
return true;
}
return s.charAt(i - 1) == p.charAt(j - 1);
}
}
官方解
-
动态规划
时间复杂度:O(mn)
空间复杂度:O(mn)