顺义专业建站公司,最全的数据网站,wordpress自动化采集,宁波企业如何建网站请实现一个函数用来匹配包含. 和*的正则表达式。模式中的字符.表示任意一个字符#xff0c;而*表示它前面的字符可以出现任意次#xff08;含0次#xff09;。在本题中#xff0c;匹配是指字符串的所有字符匹配整个模式。例如#xff0c;字符串aaa与模式. 和*的正则表达式。模式中的字符.表示任意一个字符而*表示它前面的字符可以出现任意次含0次。在本题中匹配是指字符串的所有字符匹配整个模式。例如字符串aaa与模式a.a和ab*ac*a匹配但与aa.a和ab*a均不匹配。
示例 1:
输入: s aa p a 输出: false 解释: a 无法匹配 aa 整个字符串。 示例 2:
输入: s aa p a* 输出: true 解释: 因为 * 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 a。因此字符串 aa 可被视为 a 重复了一次。 示例 3:
输入: s ab p .* 输出: true 解释: .* 表示可匹配零个或多个*任意字符.。 示例 4:
输入: s aab p c*a*b 输出: true 解释: 因为 * 表示零个或多个这里 c 为 0 个, a 被重复一次。因此可以匹配字符串 aab。 示例 5:
输入: s mississippi p mis*is*p*. 输出: false s 可能为空且只包含从 a-z 的小写字母。 p 可能为空且只包含从 a-z 的小写字母以及字符 . 和 *。
思路动态规划
dp[i][j]表示s的前i个字符和p的前j个字符是否匹配
可分为以下情况
1.s[i]p[i]
dp[i][j]dp[i-1][j-1]
2.s[i]!p[i]
2.1 p[i] .
dp[i][j]dp[i-1][j-1]
2.2 p[i]* *可以匹配0个1个以及多个
2.2.1 当s[i-1]p[i-1]||p[i-1].时
可以匹配01多
dp[i][j]dp[i][j-2]||dp[i][j-1]||dp[i-1][j]
2.2.2 当s[i-1]!p[i-1]时匹配0个
dp[i][j]dp[i][j-2]
代码
class Solution { public boolean isMatch(String s, String p) { boolean dp[][] new boolean[s.length()1][p.length()1]; dp[0][0] true; for(int j1;jp.length();j) { if(p.charAt(j-1)*dp[0][j-2]) dp[0][j] true; } for(int i1;is.length();i) { for(int j1;jp.length();j) { if(s.charAt(i-1)p.charAt(j-1)) { dp[i][j] dp[i-1][j-1]; } else if(p.charAt(j-1).) { dp[i][j] dp[i-1][j-1]; } else if(p.charAt(j-1)*) { if(j2) { if(s.charAt(i-1)p.charAt(j-2)||p.charAt(j-2).) { dp[i][j] dp[i][j-1]||dp[i][j-2]||dp[i-1][j]; } else { dp[i][j] dp[i][j-2]; } } } else { dp[i][j]false; } } } return dp[s.length()][p.length()]; }
}