原题为:https://oj.leetcode.com/problems/regular-expression-matching/
参考Code_Ganker大神的思路自己整理了一遍,原博客为http://blog.csdn.net/linhuanmars/article/details/21145563
可采用动态规划的方法解决。即采用二维数组res[s.length() + 1][p.length() + 1]表示字符串比较结果,其中res[i+1][j+1]表示s中从s[0]~s[i]形成的字符串与p中从p[0]~p[j]形成的字符串是否相符。特别的,res[0][2]表示s中不取元素时与p[0]~p[1]是否相符,如s=“aaa”,p="aa*",则res[0][2]表示“”与“aa”是否相符。
可以先自己根据例子把二维数组的取值按从小到大的顺序画出来,再找出其中的规律。
public boolean isMatch(String s, String p) {
boolean[][] res = new boolean[s.length() + 1][p.length() + 1];
res[0][0] = true;
for (int j = 0; j < p.length(); j++) {
if (p.charAt(j) == '*' && j > 0 && res[0][j - 1] == true) {
res[0][j + 1] = true;
}
for (int i = 0; i < s.length(); i++) {
if (p.charAt(j) == '*') {
if ((j > 0 && res[i + 1][j - 1] == true)
|| (res[i + 1][j] == true)
|| (res[i][j + 1] == true && (s.charAt(i) == p
.charAt(j - 1) || p.charAt(j - 1) == '.')))
res[i + 1][j + 1] = true;
} else {
if (res[i][j] == true
&& (s.charAt(i) == p.charAt(j) || p.charAt(j) == '.'))
res[i + 1][j + 1] = true;
}
}
}
return res[s.length()][p.length()];
}