问题描述
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。
样例输入
s = "aa", p = "a" s = "aa", p = "a*" s = "ab", p = ".*"
样例输出
false
true
true
考虑动态规划,先处理小部分,再通过小部分的的结果慢慢叠加进而得到整体的结果
核心代码
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 i=1;i<=p.length();i++) {
if( p.charAt(i-1)=='*' && dp[0][i-2]) {
dp[0][i]=true;
}
}
for(int i=1;i<=s.length();i++) {
for(int j=1;j<=p.length();j++) {
if(s.charAt(i-1)==p.charAt(j-1) || p.charAt(j-1)=='.') {
dp[i][j]=dp[i-1][j-1];
}else if(p.charAt(j-1)=='*') {
if(p.charAt(j-2)!='.' && p.charAt(j-2)!=s.charAt(i-1)) {
dp[i][j]=dp[i][j-2];
}else {
dp[i][j]=(dp[i][j-2] || dp[i][j-1] || dp[i-1][j]);
}
}
}
}
return dp[s.length()][p.length()];
}
}