zoukankan      html  css  js  c++  java
  • 剑指offer-正则表达式匹配

    package JZOffer;
    
    /**
     * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,
     * 而'*'表示它前面的字符可以出现任意次(包含0次)。
     * 在本题中,匹配是指字符串的所有字符匹配整个模式。
     * 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
     */
    
    /**
     * 解题的思路:
     * 采用递归的方法,每次从现有的字符串中拿出一个字符和模式字符串中的字符去匹配
     * 1、如果字符串中的字符ch1(字符串中的第一个字符)和模式字符串中的字符ch2(模式串中的第一个字符)匹配,或者模式字符串用于匹配的字符是'.',那么匹配成功,
     * 接着递归匹配后面的字符,否则直接返回false
     * 2、如果当前模式字符串中的第二个字符(ch2是第一个字符)为'*',那么存在多种不同的匹配方式:
     * (1)忽略*和它前面的字符,相当于*前面的字符出现0次,该字符不参与字符串的匹配工作,模式串向后移动两个位置;
     * (2)如果ch1和ch2匹配了,则字符串向后移动一个位置,而对于模式串则可以有两种选择:
     *      1)模式串保持不变(可能*前面的字符串重复出现多次)
     *      2)模式串向后移动两个位置(*前面的字符串重复出现一次)
     * 
     * */
    public class JZ52 {
    
        public boolean match (String str, String pattern) {
            // write code here
    
            if (str == null && pattern == null){
                return true;
            }
    
            if (str == null || pattern == null){
                return false;
            }
    
            return matchCore(str,pattern);
        }
    
        private boolean matchCore(String str,String pattern){
    
            if (str.length() == 0 && pattern.length() == 0){
                return true;
            }
    
            if (str.length() != 0 && pattern.length() == 0){
                return false;
            }
    
            if (pattern.length() > 1 && pattern.charAt(1) == '*'){
    
                if (str.length() > 0 && (pattern.charAt(0) == str.charAt(0) || (pattern.charAt(0) == '.'))){
                    return matchCore(str.substring(1),pattern.substring(2))
                            || matchCore(str.substring(1),pattern)
                            || matchCore(str,pattern.substring(2));
                }else {
    
                    return matchCore(str,pattern.substring(2));
                }
            }
    
            if (str.length() > 0 && (str.charAt(0) == pattern.charAt(0) || pattern.charAt(0) == '.')){
    
                return matchCore(str.substring(1),pattern.substring(1));
            }
            
            return false;
        }
    
    }
    
    
  • 相关阅读:
    MySQL 数据实时同步到 Elasticsearch 的技术方案选型和思考
    编写高质量可维护的代码之优化逻辑判断
    Java8 lambda表达式常见用法
    jar安装到maven本地仓库
    微信小程序获取用户手机号
    spring aop 、Redis实现拦截重复操作
    redis自定义RedisCacheManager
    locust做并发测试实战
    几个绕过短信验证码限制的漏洞挖掘
    通达OA任意用户登录和后台GetShell漏洞复现
  • 原文地址:https://www.cnblogs.com/yxym2016/p/14728095.html
Copyright © 2011-2022 走看看