动态规划 10.正则表达式匹配
给你一个字符串 s
和一个字符规律 p
,请你来实现一个支持 '.'
和 '*'
的正则表达式匹配。
'.'
匹配任意单个字符
'*'
匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。
示例 1:
代码语言:javascript复制输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
代码语言:javascript复制输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
代码语言:javascript复制输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
提示:
代码语言:javascript复制1 <= s.length <= 20
1 <= p.length <= 30
s
只包含从 a-z 的小写字母。
p
只包含从 a-z 的小写字母,以及字符 .
和 *
。
保证每次出现字符 *
时,前面都匹配到有效的字符
public static boolean isMatch(String s, String p) {
int s1 = s.length();
int s2 = p.length();
// 建立表格
boolean[][] dp = new boolean[s1 1][s2 1];
// 边界条件 两个空字符串可以匹配 因此增加一行一列表示空
// [] B . A B * B
// [] T F F F F F F
// B F T F F F F F
// A F F T F F F F
// C F F F F F F F
// B F F F F F F F
dp[0][0] = true;
// 逐行,从第一行开始填写
for (int i = 0; i < s1 1; i ) {
// 第一列为边界条件,从第二列开始填写
for (int j = 1; j < s2 1; j ) {
// 第一行为特殊情况 因为s[0]是一个字符,不为空,因此要单独处理
if (i == 0) {
// 这种情况只有 [x]*,且[x]的个数为 0 时,才可能为true
if (p.charAt(j - 1) == '*') {
// j 指向 * j - 1 指向 [x] j - 2 指向 [x]* 之前的那个元素
// 在这种情况下只有 j - 2 == 0 即指向空串的时候,才可能为true
dp[i][j] = dp[i][j - 2];
}
} else {
// 之后就不可能出现空串了,因此只要指向 '.',就可以认为两个指针各自指向的字符相等
// 因此如果本次两个指针指向的字符相等,且指针移动之前的状态为true,本次的状态就位true
if (p.charAt(j - 1) == '.' || p.charAt(j - 1) == s.charAt(i - 1)) {
// 根据动态规划的思路,将两个指针向前移一格,找到指针移动之前的状态(匹配的结果)
dp[i][j] = dp[i - 1][j - 1];
}
// 如果指向 '*',是没有意义的,因此要找前一个字符[x]
// 但我们可以先判断 [x]* 长度为 0 的情况
if (p.charAt(j - 1) == '*') {
// 如果长度为 0,找 j - 2 的状态,如果为true,说明长度为0匹配
if (dp[i][j - 2]) {
dp[i][j] = true;
// 如果长度为0不匹配
// 如果 j - 1 与 i 处的字符匹配 或是 j - 1 处为 '.'
// 并且 [i - 1][j] 的结果为true,那么本次结果也为true
// [i - 1][j] 指的是上次 * 匹配的结果,如果为true,那么本次只要复制一个[x]即可,即[x]出现次数 1
} else if ((p.charAt(j - 1 - 1) == s.charAt(i - 1) || p.charAt(j - 1 - 1) == '.') && dp[i - 1][j]){
dp[i][j] = true;
}
}
}
}
}
// 返回右下角的状态
return dp[s1][s2];
}
练习网址:https://alchemist-al.com/algorithms/regular-expression 推荐回答:https://leetcode.cn/problems/regular-expression-matching/solution/shi-pin-tu-jie-dong-tai-gui-hua-zheng-ze-biao-da-s/