标签:
原题链接在这里:https://leetcode.com/problems/regular-expression-matching/
正则表达式如果期望着一个字符一个字符的匹配,是非常不现实的.而"匹配"这个问题,非 常容易转换成"匹配了一部分",整个匹配不匹配.
所以要看"剩下的匹配"情况.这就很好的把 一个大的问题转换成了规模较小的问题:递归
如果pattern是"x*"类型的话,那么pattern每次要两个两个的减少.否则,就是一个一个 的减少. 无论怎样减少,都要保证pattern有那么多个.比如s.substring(n), 其中n 最大也就是s.length()
递归的终止条件是没么p的长度为0看s的长度是否为0, 要么是p的长度为1看s和p的最后一个字符能对上或者p的最后一个字符是不是‘.‘.
Time Complexity: O(2^n).
AC Java:
1 public class Solution { 2 public boolean isMatch(String s, String p) { 3 if(p.length() == 0){ 4 return s.length() == 0; 5 } 6 if(p.length() == 1){ 7 return s.length() == 1 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == ‘.‘); 8 } 9 10 //经过上面两个if, 此时p的长度已经大于等于2 11 if(p.charAt(1) != ‘*‘){ //p第二个字符不是 ‘*‘ 12 return s.length()>0 13 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == ‘.‘) //第一个字符是否相等 或者pattern第一个字符是‘.‘ 14 && isMatch(s.substring(1),p.substring(1)); //剩下的字符串是否match 15 }else{ //p第二个字符是 ‘*‘ 16 if(isMatch(s, p.substring(2))){ 17 return true; 18 } 19 return s.length()>0 //字符串长度需要大于0 20 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == ‘.‘) //当前字符串相等 或者pattern第一个字符是‘.‘ 21 && isMatch(s.substring(1), p); //去掉s的首字符 22 } 23 } 24 }
Ref: http://harrifeng.github.io/algo/leetcode/regular-expression-matching.html
方法二是用DP, 其实是一个思路。
dp[i][j] 代表长度为i的s 和 长度为j的p是否能match上,最后返回dp[s.length()][p.length()].
所以dp生成时要设size成new boolean[s.length()+1][p.length()+1].
AC Java:
1 public class Solution { 2 public boolean isMatch(String s, String p) { 3 //Method 2 DP 4 boolean [][] dp = new boolean[s.length()+1][p.length()+1]; 5 dp[0][0] = true; 6 for(int i = 0; i<=s.length(); i++){ 7 for(int j = 1; j<=p.length(); j++){ 8 if(i!=0){ 9 char c = p.charAt(j-1); 10 if(j>1 && c == ‘*‘){ //p尾字符是‘*‘ 11 dp[i][j] = dp[i][j-2] //‘*‘ match 0个 12 || dp[i][j-1] //‘*‘ match 1个 13 || (isSame(s.charAt(i-1),p.charAt(j-2)) && dp[i-1][j]); //‘*‘ match 多个 14 }else{ //p尾字符是不‘*‘ 15 if(isSame(s.charAt(i-1),c) && dp[i-1][j-1]){ 16 dp[i][j] = true; 17 } 18 } 19 }else{ //s为空字符串 20 if(j>=2 && p.charAt(j-1) == ‘*‘ && dp[0][j-2]){ 21 dp[0][j] = true; 22 } 23 } 24 } 25 } 26 return dp[s.length()][p.length()]; 27 } 28 private boolean isSame(char s, char p){ 29 return p == ‘.‘ || p == s; 30 } 31 }
Ref: http://www.cnblogs.com/icecreamdeqinw/p/4317183.html
LeetCode Regular Expression Matching
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4951782.html