Implement regular expression matching with support for '.' and '*'.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
public class Solution {
public boolean isMatch(String s, String p) {
// s.substring[0,i] matched p.substring[0,j]
boolean[][] matched = new boolean[s.length() + 1][p.length() + 1];
matched[0][0] = true;
for(int j=1; j<p.length(); j += 2){
if(p.charAt(j) == '*') {
matched[0][j+1] = matched[0][j-1]; //matched zero before
}
}
for(int i=1; i<=s.length(); i++){
for(int j=1; j<=p.length(); j++){
if(p.charAt(j-1) != '*'){
matched[i][j] = matched[i-1][j-1] && isCharMatch(s.charAt(i-1), p.charAt(j-1));
} else {
// 解释清楚这两个条件是如何推导的。
// i,j-2 表示match zero char, i维持原位置,j位置的*,和j-1位置的char一同消失。
// i-1,j 表示match one char, s(i-1)和p(j-2)位置char是否相同.
matched[i][j] = matched[i][j-2] ||
matched[i-1][j] && isCharMatch(s.charAt(i-1), p.charAt(j-2));
}
}
}
return matched[s.length()][p.length()];
}
public boolean isCharMatch(char s, char p){
return p == '.' || s == p;
}
}
s = "ab" p = ".*"
. *
T F T
a F T T
b F F T
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。