[leetcode]Regular Expression Matching

来源:互联网 发布:淘宝店铺倒计时代码 编辑:程序博客网 时间:2024/06/16 11:54

Regular Expression Matching

题意:实现这个所谓的正则表达式匹配

           .可以匹配任何一个单独的char,

      *可以让*之前的符号变成0个,或者任意多个

对给出样例进行解释:

isMatch("aa","a") → false      a只能匹配一个a,剩余一个a无法匹配

isMatch("aa","aa") → true      每a都有一个对应a

isMatch("aaa","aa") → false    有一个a无法被匹配

isMatch("aa", "a*") → true     a*可以是空,也可以是a也可以是aa,也可以是任意多个a

isMatch("aa", ".*") → true     .*可以是0个,或者任意多个.

isMatch("ab", ".*") → true      同上

isMatch("aab", "c*a*b")→ true  c*可以是0个c,就是什么都不匹配,a*匹配aa,b匹配b

 

解法:

         DP解法

         F[i][j]代表s的前i个字符与p的前j个字符是否匹配,特别说明f[0][0]自然是true,当i>0时,f[0][i]只有i是*,i-1不是*,并且f[0][i-2]是true时,才为true。

         当i大于0时,对于所有的f[i][0],都为false。

         当计算f[i][j]时,若p的第j位为.,则f[i][j]=f[i-1][j-1]

                                        若p的第j位为字母,若p的第j位与s的第i位相同,f[i][j]=f[i-1][j-1],否则f[i][j]=false;

                                        若p的第j位为*,如果第j-1位为*,f[i][j]=false;

                                                                               如果第j-1位为., 若f[0][j-2]到f[i][j-2]有一个true,f[i][j]=true;

                                                                                    如果第j-1位为字母,若f[i][j-2]为true,f[i][j]=true

                                                                                                                            若f[k-1][j-2]为true,k<=I,并且s的第k到i位都为p的第j位,则f[i][j]=true

         返回f[n.length()][m.length()]

         算法平均情况复杂度为O(n*m),当出现较多*时,会退化到O(n^2*m),例如出现s=”zzzzzzzzzzzz”,p=”x.*.*.*.*.*.*”时,我们利用进行适当剪枝,若f[0][j-2]到f[i][j-2]与f[0][j-1]到f[i][j-1]全为false,则意味着p的前j-1段不可能与结果匹配,这个应该放在对f[x][j]进行整体计算之前进行判断。现在只是理论上认为该算法是O(n^2*m),是否在加入适当剪枝后可以使算法最坏情况有更紧确的上届还不清楚。

public class Solution142 {

         publicboolean isMatch(String s, String p) {

       int n=s.length();

       int m=p.length();       

       boolean[][] f=new boolean[n+1][m+1];

       f[0][0]=true;

       for (int i=1;i<=m;i++){

                if (i>=2){

                          if(p.charAt(i-1)=='*'&&p.charAt(i-1-1)!='*'){

                                   f[0][i]=f[0][i-2];

                          }

                }else{

                          f[0][i]=false;

                }

       }

       for (int i=1;i<=n;i++){

                f[i][0]=false;

                for (int j=1;j<=m;j++){

                          if(p.charAt(j-1)=='.'){

                                   f[i][j]=f[i-1][j-1];

                                   continue;

                          }

                          if(p.charAt(j-1)!='*'){

                                   if(p.charAt(j-1)==s.charAt(i-1)){

                                            f[i][j]=f[i-1][j-1];                                            

                                   }

                                   continue;

                          }

                          if (j==1){

                                   returnfalse;

                          }

                          if(p.charAt(j-1-1)=='*'){

                                   returnfalse;

                          }

                          if(p.charAt(j-1-1)!='.'){

                                   if(f[i][j-2]){

                                            f[i][j]=true;

                                            continue;

                                   }

                                   charc=p.charAt(j-1-1);

                                   for(int k=i;k>=1;k--){

                                            if(s.charAt(k-1)!=c){

                                                      break;

                                            }

                                            if(f[k-1][j-2]){

                                                      f[i][j]=true;

                                                      break;

                                            }

                                   }

                          }else{

                                   if(f[i][j-2]){

                                            f[i][j]=true;

                                            continue;

                                   }

                                   for(int k=1;k<=i;k++){

                                            if(f[k-1][j-2]){

                                                      f[i][j]=true;

                                                      break;

                                            }

                                   }

                          }

                }

       }

       return f[n][m];

    }

}

 

         递归解法:

                   递归解法的时间复杂度是指数级的,不推荐,不过程序会比DP好写很多。

                   给一个参考链接http://www.cnblogs.com/RazerLu/p/3535641.html

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡绑定太多微信了怎么办 怎样给qq设密码怎么办 吃了心悦胶囊上火怎么办 qq暂时被冻结了怎么办 部落群审核未通过怎么办 qq被限制解封该怎么办 微信提现成功但没到账怎么办 拍拍贷登录不上怎么办 京东店铺出租保证金怎么办 所选地区无货怎么办 闲鱼七天没发货怎么办 续贷密码忘了怎么办 微店商家不发货怎么办 微店商家不退钱怎么办 维修车辆被拍违章停车怎么办 网贷申请平台太多怎么办 所在城市没有网店怎么办信用卡 拍拍贷不放款了怎么办 拍拍贷账号注销了怎么办 我在拍拍贷注销了怎么办 快贷逾期一年了怎么办 广州车牌买新车旧车怎么办 高尔夫旅行款被锁在车内怎么办 英雄联盟误删文件怎么办 拍拍贷换了号码怎么办 手机打开显示无法连接服务器怎么办 剑灵画面卡顿怎么办 cf被永久禁赛了怎么办 微信没有微游戏商店怎么办 游侠云盒下载慢怎么办2018 安卓手机玩网页游戏卡怎么办 safari点开什么都没有怎么办 康佳电视全网搜索打不开怎么办 脚被图钉扎了怎么办 电脑中毒了打不开软件怎么办 剑三程序不兼容怎么办 玩无主之地卡怎么办 平台老板跑路了怎么办 qq在苹果下载不了怎么办 下载速度快上传速度慢怎么办 苹果7开网页慢怎么办