zoukankan      html  css  js  c++  java
  • 19. 正则表达式匹配

    19. 正则表达式匹配

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

    '.' 匹配任意单个字符
    '*' 匹配零个或多个前面的那一个元素
    

    所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

    说明:

    • s 可能为空,且只包含从 a-z 的小写字母。
    • p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *

    示例 1:

    输入:
    s = "aa"
    p = "a"
    输出: false
    解释: "a" 无法匹配 "aa" 整个字符串。
    

    示例 2:

    输入:
    s = "aa"
    p = "a*"
    输出: true
    解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
    

    示例 3:

    输入:
    s = "ab"
    p = ".*"
    输出: true
    解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
    

    示例 4:

    输入:
    s = "aab"
    p = "c*a*b"
    输出: true
    解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
    

    示例 5:

    输入:
    s = "mississippi"
    p = "mis*is*p*."
    输出: false

    class Solution {
        public boolean isMatch(String s, String p) {
            if(s == null || p == null) return false;
            return match(s,0,p,0);
        }
        private boolean match(String s,int si,String p,int pi){
            if(si == s.length() && pi == p.length()) return true;
            if(si < s.length() && pi >= p.length()) return false;
            boolean firstMatch = (si < s.length() && pi < p.length()) 
                && (s.charAt(si) == p.charAt(pi) || p.charAt(pi) == '.');
            //若第2为'*'
            if(pi + 1 < p.length() && p.charAt(pi + 1) == '*'){
                //1. si+1,pi --- ( >=1 )个相同,pass  2.si,pi + 2 --- ( 0 )个相同
                if(firstMatch){
                    return match(s,si +1,p,pi) || match(s,si,p,pi +2 );                 
                }else{
                    //第一个未匹配上,利用'*'放弃p的第一个,但是s不动
                    return match(s,si,p,pi + 2);
                }
            }else{
                //若第一位匹配上,则进行下一位,否则结束
                if(firstMatch){
                    return match(s,si + 1,p,pi + 1);
                }else{
                    return false;
                }      
            } 
        }
    }
    一回生,二回熟
  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12635393.html
Copyright © 2011-2022 走看看