题目链接:http://www.lintcode.com/zh-cn/problem/regular-expression-matching/
参考资料:http://www.cnblogs.com/wuchaodzxx/p/5846284.html 【思路正确,但是伪代码写错了:字符串中的第j个字符的位置应该是j-1】
///动态规划
public boolean match(char[] str, char[] pattern) {
boolean[][] dp = new boolean[str.length + 1][pattern.length + 1];
dp[0][0] = true;
for (int j = 1; j < dp[0].length; j ++) { //dp[0].length表示列数
if(pattern[j - 1] == '*' && j>=2)
dp[0][j] = dp[0][j - 2];
}
for (int i = 1; i < dp.length; i ++) { //dp.length表示行数
for (int j = 1; j < dp[0].length; j ++) {
//
if(pattern[j - 1] == '.' || pattern[j - 1] == str[i - 1])
dp[i][j] = dp[i - 1][j - 1];
//当模式的字符为*时:分两种情况
else if(pattern[j - 1] == '*' && i>=2) {
if(pattern[j - 2] != str[i - 1] && pattern[j - 2] != '.')
dp[i][j] = dp[i][j - 2];
else dp[i][j] = dp[i][j - 1] || dp[i][j - 2] || dp[i - 1][j];
}
}
}
return dp[str.length][pattern.length];
}
上面的动态规划比较难理解,采用下面的方法:
public class RegularExpressionMatching {
public boolean isMatch(String s, String p) {
if(s==""||p=="")
return false;
char[] str=s.toCharArray();
char[] pattern=p.toCharArray();
int strIndex=0;
int patternIndex=0;
return matchCore(str, strIndex, pattern,patternIndex );
}
public boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex) {
//有效性检验:str到尾,pattern到尾,匹配成功
if (strIndex == str.length && patternIndex == pattern.length) {
return true;
}
// pattern先到尾,匹配失败
if (strIndex != str.length && patternIndex == pattern.length) {
return false;
}
// 模式第2个是*,且字符串第1个跟模式第1个匹配,分3种匹配模式;如不匹配,模式后移2位
if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {
if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])
|| (pattern[patternIndex] == '.' && strIndex != str.length)) {
return matchCore(str, strIndex, pattern, patternIndex + 2)// 模式后移2,视为x*匹配0个字符
|| matchCore(str, strIndex + 1, pattern,
patternIndex + 2)// 视为模式匹配1个字符
|| matchCore(str, strIndex + 1, pattern, patternIndex);// *匹配1个,再匹配str中的下一个
} else {
return matchCore(str, strIndex, pattern, patternIndex + 2);
}
}
// 模式第2个不是*,且字符串第1个跟模式第1个匹配,则都后移1位,否则直接返回false
if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])
|| (pattern[patternIndex] == '.' && strIndex != str.length)) {
return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
}
return false;
}
}