zoukankan      html  css  js  c++  java
  • leetcode — regular-expression-matching

    /**
     * Source : https://oj.leetcode.com/problems/regular-expression-matching/
     *
     * Created by lverpeng on 2017/6/30.
     *
     * * Implement regular expression matching with support for '.' and '*'.
     *
     * '.' Matches any single character.
     * '*' Matches zero or more of the preceding element.
     *
     * The matching should cover the entire input string (not partial).
     *
     * The function prototype should be:
     * bool isMatch(const char *s, const char *p)
     *
     * Some examples:
     * isMatch("aa","a") → false
     * isMatch("aa","aa") → true
     * isMatch("aaa","aa") → false
     * isMatch("aa", "a*") → true
     * isMatch("aa", ".*") → true
     * isMatch("ab", ".*") → true
     * isMatch("aab", "c*a*b") → true
     *
     * =============== 关于星号 ===================
     * isMatch("aab", "c*a*b") → true
     * 星号是匹配前面一个字符零次或者多次,上面第一个星号前面是c,那么目标字符可以没有c,所以上面的结果是true
     *
     */
    public class RegularExpressMatching {
    
    
        /**
         * . 匹配任意字符
         * * 匹配前一个字符0次或者多次
         *
         * 如果pattern为空,str也为空,返回true,否则返回false
         * 如果pattern的长度为1,str的长度也为1,两个字符相同或者pattern为 '.' 则返回true,否则返回false
         * 如果pattern第二个字符不为'*' ,s长度为空返回false,否则,如果第一个字符相同或者p的第一个为 '.' 则递归比较s.subString(1) p.subString(1),否则返回false
         * 如果pattern第二个字符为 '*' ,如果s不为空并且s和p第一个字符相同的时候:
         *      匹配零次:递归比较s和p.subString(2),如果匹配成功返回true
         *      匹配多次:将s向前移动一个字符进行匹配
         * 如果s为空或者s、p第一个字符不匹配,递归匹配s和p.subString(2)
         *
         * @param s
         * @param p
         * @return
         */
        public boolean isMatch (String s, String p) {
            if (p.length() ==0) {
                return s.length() == 0;
            }
            if (p.length() == 1) {
                if (s.length() == 1 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')) {
                    return true;
                }
                return false;
            }
            if (p.charAt(1) != '*') {
                if (s.length() == 0) {
                    return false;
                }
                return p.charAt(0) == '.' || p.charAt(0) == s.charAt(0) ? isMatch(s.substring(1), p.substring(1)) : false;
            }
    
            while (s.length() != 0 && (p.charAt(0) == '.' || p.charAt(0) == s.charAt(0))) {
                if (isMatch(s, p.substring(2))) {
                    return true;
                }
                s = s.substring(1);
            }
            return isMatch(s, p.substring(2));
        }
    
        public static void main(String[] args) {
            RegularExpressMatching regularExpressMatching = new RegularExpressMatching();
            System.out.println(regularExpressMatching.isMatch("aa","a"));
            System.out.println(regularExpressMatching.isMatch("aa","aa"));
            System.out.println(regularExpressMatching.isMatch("aaa","aa"));
            System.out.println(regularExpressMatching.isMatch("aa","a*"));
            System.out.println(regularExpressMatching.isMatch("aa",".*"));
            System.out.println(regularExpressMatching.isMatch("ab",".*"));
            System.out.println(regularExpressMatching.isMatch("aab","c*a*b"));
        }
    
    }
    
  • 相关阅读:
    [日常工作]WorkStation 使用端口转发的方式使用宿主机IP地址提供服务
    [日常工作]虚拟机或者实体机转换成HyperV虚拟机的方法
    [linux学习]sysctl 以及 net.ipv4.ip_forward
    [自学]Docker system 命令 查看docker镜像磁盘占用情况 Docker volume 相关
    Docker 修改默认存储路径的一个方法
    [学习笔记]Ubuntu下安装配置SQLSERVER2017
    VSCODE安装以及使用Python运行调试代码的简单记录
    Win2012r2 以及win2016 安装.NET3.5
    Win2016以及win10 IIS10 下安装IEwebcontrol的方法
    [日常工作]协助同事从不能开机的机器上面获取资料信息
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/7277315.html
Copyright © 2011-2022 走看看