leetcode 0044
说明
只是为了记录一下,不求多快,也不深究。
会简要描述思路,代码中不写注释。
如碰到不会做的用了别人代码会在博客中标出。
题目描述
思路
又是正则匹配,很像之前的第10题,那时候看到这种题还是一脸懵逼,现在已经能写出来了,有进步。
还是用dp做,先初始化,dp[0][j]有可能是true,要看是不是全是*,dp[i][0]肯定就是false了。
然后就是一步步往下推,p里面遇到?是一定匹配的,那就看之前dp[i-1][j-1]是不是true了。
另一种情况是p里遇到*,如果dp[i][j-1]已经是true的话,说明这个*多余了,记作空,dp[i][j]当然是true;
如果dp[i][j-1]不匹配,就看dp[k][j-1]里面是否有匹配的,k属于0~i,毕竟*可以表示任何字符串,只要前面一部分匹配,后面不匹配的都能变出来。
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() + 1; i++) {
if (p.charAt(i - 1) == '*') {
dp[0][i] = dp[0][i - 1];
}
}
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];
}
if (p.charAt(j - 1) == '*') {
if (dp[i][j - 1]) {
dp[i][j] = true;
} else {
for (int k = 0; k < i; k++) {
if (dp[k][j]) {
dp[i][j] = true;
break;
}
}
}
}
}
}
return dp[s.length()][p.length()];
}
}