【算法20】-【正则表达式匹配】
题目:请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
方法一:递归
import java.util.Arrays; class Solution { public boolean isMatch(String s, String p) { // invoke params check if (s == null || p == null) { return false; } // match core method char[] s1 = s.toCharArray(); char[] p1 = p.toCharArray(); return matchCore(s1, p1); } public boolean matchCore(char[] s, char[] p) { if (s.length == 0 && p.length == 0) { return true; } if (s.length != 0 && p.length == 0) { return false; } if (p.length >= 2 && p[1] == '*') { // [] matches a '*' if (s.length == 0) { return matchCore(s, Arrays.copyOfRange(p, 2, p.length)); } if (s[0] == p[0] || (p[0] == '.' && s.length != 0)) { // move on the next state return matchCore(Arrays.copyOfRange(s, 1, s.length), Arrays.copyOfRange(p, 2, p.length)) // stay on the current state || matchCore(Arrays.copyOfRange(s, 1, s.length), p) // ignore a '*' || matchCore(s, Arrays.copyOfRange(p, 2, p.length)); } else { // ignore a '*' return matchCore(s, Arrays.copyOfRange(p, 2, p.length)); } } if (s.length == 0) { return false; } if (s[0] == p[0] || (p[0] == '.' && s.length != 0)) { return matchCore(Arrays.copyOfRange(s, 1, s.length), Arrays.copyOfRange(p, 1, p.length)); } return false; } }
方法二:动态规划
class Solution { public boolean isMatch(String s, String p) { int m = s.length(); int n = p.length(); boolean[][] f = new boolean[m + 1][n + 1]; f[0][0] = true; for (int i = 0; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (p.charAt(j - 1) == '*') { f[i][j] = f[i][j - 2]; if (matches(s, p, i, j - 1)) { f[i][j] = f[i][j] || f[i - 1][j]; } } else { if (matches(s, p, i, j)) { f[i][j] = f[i - 1][j - 1]; } } } } return f[m][n]; } public boolean matches(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); } }