码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Regular Expression Matching

时间:2015-11-10 07:03:39      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:

原题链接在这里: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!