题目
Given an input string (s
) and a pattern (p
), implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character. '*' Matches zero or more of the preceding element.
1.递归解
思路:
从pattern的长度来考虑递归结束条件.
1.当pattern的长度为0时,s的长度也为0时返回true
2.当pattern的长度为1时,s.charAt(0)==p.charAt(0)或者p.charAt(0)=='.'时,返回true
3.当pattern的长度大于1时,如果p.charAt(1)不是'*',比较同2.否则分情况比较:
(1) s.charAt(0)==p.charAt(0)或者p.charAt(0)=='.'时,继续比较s与p.substring(2)或者s.substring(1)与p,只要有一个成功匹配,返回true.
(2)s.charAt(0)!=p.charAt(0),比较s与p.substring(2)
代码
class Solution {
public boolean isMatch(String s, String p) {
if (p.length() == 0){
return s.length()==0;
}
if (p.length() == 1 || p.charAt(1) != '*'){
if (s.length() !=0 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')){
return isMatch(s.substring(1),p.substring(1));
} else {
return false;
}
}
while(s.length() != 0 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')){
if (isMatch(s,p.substring(2))){
return true;
}
s = s.substring(1);
}
return isMatch(s,p.substring(2));
}
}
2.动态规划
思路:
假设dp[i][j]为true表示s.substring(0,i)与p.substring(0,j)匹配
当p.charAt(j)==s.charAt(i)时,dp[i][j] = dp[i-1][j-1]
当p.charAt(j)=='.'时,dp[i][j] = dp[i-1][j-1]
当p.charAt(j)=='*'时
(1) if s.charAt(i)!=p.charAt(j-1),dp[i][j] = dp[i][j-2]
(2) if s.charAt(i)==p.charAt(j-1) || p.charAt(i)=='.',dp[i][j]=dp[i-1][j] or dp[i][j]=dp[i][j-1] or dp[i][j]=dp[i][j-2]
代码
class Solution {
public boolean isMatch(String s, String p) {
if (s == null || p == null) {
return false;
}
boolean[][] dp = new boolean[s.length()+1][p.length()+1];
dp[0][0] = true;
for (int i = 0; i < p.length(); i++) {
if (p.charAt(i) == '*' && dp[0][i-1]) {
dp[0][i+1] = true;
}
}
for (int i = 0 ; i < s.length(); i++) {
for (int j = 0; j < p.length(); j++) {
if (p.charAt(j) == '.' || p.charAt(j) == s.charAt(i)) {
dp[i+1][j+1] = dp[i][j];
}
if (p.charAt(j) == '*') {
if (p.charAt(j-1) != s.charAt(i) && p.charAt(j-1) != '.') {
dp[i+1][j+1] = dp[i+1][j-1];
} else {
dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]);
}
}
}
}
return dp[s.length()][p.length()];
}
}