题目
样例
思路
字符串 p 要涵盖整个字符串 s才算匹配成功,使用动态规划
定义二维布尔数组 match[s.length() + 1][p.length() + 1] ,对于 match[ i ] [ j ] 的值有以下几种情况要考虑
1.s.charAt(i - 1) == p.chatAt(j - 1),看match[i - 1][j - 1];
2.p.charAt(j - 1) == ’ * ’ ;先赋值 match[ i ][ j - 2 ],若s.charAt(i - 1) == p.chatAt(j - 2),match[i][j] = match[i-1][ j ] || match[ i ][ j ];
源代码
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length(), n = p.length();
boolean[][] match = new boolean[m + 1][n + 1];
match[0][0] = true;
for (int i = 0; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (p.charAt(j - 1) == '*') {
match[i][j] = match[i][j - 2];
if (match(s, p, i, j - 1)) {
match[i][j] = match[i][j] || match[i - 1][j];
}
} else {
if (match(s, p, i, j)) {
match[i][j] = match[i - 1][j - 1];
}
}
}
}
return match[m][n];
}
private boolean match(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);
}
}