剑指 Offer 19. 正则表达式匹配

摘要:
classSolution{publicbooleanisMatch(Strings,Stringp){intm=s.length();intn=p.length();inti=0,j=0;char[]s1=s.toCharArray();char[]p1=p.toCharArray();returnisMatch(s1,p1,m,n,i,j);}privatebooleanisMatch(cha
classSolution {
    public booleanisMatch(String s, String p) {
        int m =s.length();
        int n =p.length();
        int i = 0,j = 0;
        char[] s1 =s.toCharArray();
        char[] p1 =p.toCharArray();
        returnisMatch(s1,p1,m,n,i,j);
    }

    private boolean isMatch(char[] s1, char[] p1, int m, int n, int i, intj) {
        if(i == m && j == n) return true;
        if(i<m && j<n) {
            if(s1[i] == p1[j] || p1[j] == '.'){
                if(j+1<n && p1[j+1] == '*'){
                    return isMatch(s1, p1, m, n, i, j + 2)||isMatch(s1, p1, m, n, i + 1, j)||isMatch(s1, p1, m, n, i + 1, j + 2);
                }else{
                    return isMatch(s1, p1, m, n, i + 1, j + 1);
                }
            } else if (j + 1 < n && p1[j + 1] == '*') {
                return isMatch(s1, p1, m, n, i, j + 2);
            } }
        while(j<n){
            if(p1[j] == '*') j++;
            else if(j+1<n && p1[j+1] == '*'){
                j = j+2;
            }else{
                return false;
            }
        }
        return i == m && j ==n;
    }
}

剑指 Offer 19. 正则表达式匹配第1张


方法二:从后往前匹配

public booleanisMatch(String s, String p) {
        int m =s.length();
        int n =p.length();
        int i = m-1,j = n-1;
        char[] s1 =s.toCharArray();
        char[] p1 =p.toCharArray();
        returnisMatch(s1,p1,i,j);
    }

    private boolean isMatch(char[] s1, char[] p1,int i, intj) {
        if(i == -1 && j == -1) return true;
        if(i>=0 && j>=0) {
            if(s1[i] == p1[j] || p1[j] == '.'){
                return isMatch(s1, p1,i - 1, j - 1);
                
            } else if (p1[j] == '*') {
                if(j>0 && p1[j-1] == s1[i] || p1[j-1] == '.'){
                    return isMatch(s1, p1,i - 1, j - 1) || isMatch(s1, p1,i - 1, j) || isMatch(s1, p1,i, j - 2);
                }
                return isMatch(s1, p1,i, j - 2);
            }
        }
        while(j>=0){
            if(j>0 && p1[j] == '*'){
                j = j - 2;
            } else{
                return false;
            }
        }
        return i == -1 && j == -1;
    }

剑指 Offer 19. 正则表达式匹配第2张

免责声明:文章转载自《剑指 Offer 19. 正则表达式匹配》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇华为内部面试题库(10)Zabbix 中文使用手册下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

WinPE无法识别NVMe SSD硬盘,如何重装系统

)WinPE无法识别NVMeSSD硬盘,如何重装系统现在NVMeSSD硬盘越来越流行了,而市面上流行的WinPE系统,比如什么大白菜、老毛桃、微PE根本无法识别这种硬盘,这个时候想要重装系统应该怎么办呢?其实,不能识别的原因,归根结底,还是因为这些WinPE缺少NVMeSSD硬盘的驱动。看下图,intelRST文件夹中要有这些文件。...

Visual Studio Code 之 运行java代码

2、安装成功后,会在右键菜单中多出一个选项:更改vscode“用户设置”文件:添加java.home以及runcode显示在终端coderunner原生的配置有些问题,更改其中终端的命令:加入红色的部分3、点击RunCode,会执行相应的文件...

Redis之有序集合(Zset)

序列号命令和描述1ZADDkeyscore1member1[score2member2]将一个或多个成员添加到有序集合。...

爱快路由器的一些注意事项硬件配置+多线负载均衡

以下数据仅供参考:注意:磁带载体的数量因使用环境和带宽大小的不同而不同。此外,请注意32位系统的安装。最大内存为4G,最大内存为3G-----硬盘------安装“爱快路由”时对硬盘的最低要求为1G以上。...

如何在jenkins上新建一个项目及其简单配置

单击[新建]进入选择页面,您可以在此页面上配置项目(包括拉取源代码、修改连续构建时间以及在打包和部署之前修改配置文件)3。在General中,您可以设置要构建的版本,如下图5所示。在源代码管理模块中,您可以设置源代码地址(我们公司常用的Git)6。如果是自动构建,您可以将自动构建时间(即构建频率)设置为7。以下是构建中的一些设置。您可以使用shell修改源代...

RedisTemplate

在SpringBoot@RequestMapping(“/del/{key}”)publicStringdel(@PathVariable(“key”)Stringkey){try{//当该键不存在时,异常redisTemplate.delete(key);return“Success”;}将不会引发catch(Exceptione){returne.get...