[Leetcode] Wildcard Matching

本文深入探讨了使用正则表达式匹配字符串的方法,包括递归和非递归两种解决方案。重点介绍了如何通过递归和非递归的方式处理星号(*)的匹配情况,详细解释了每种方法的实现逻辑和步骤,旨在提供一种全面理解正则表达式匹配技术的途径。

*匹配任意多个字符,.匹配单个字符

关键在于*的情况,如果遇到了星号,那么需要枚举所有与星号匹配的情况,包括空串的情况

一、递归解法

 1 boolean isMRecursive(String s,String p){
 2     if(p.compareTo("")==0) return s.compareTo("")==0;//如果匹配串为空,那么s也应该为空;
    if(s.compareTo("")==0){
      //如果s为空,那么匹配串应该是*
      for(int i=0;i<p.length();i++){
        if(p.charAt(i)!='*')
          return false;
      }
      return true;
    }
3 if(p.charAt(0)=='*'){ 4 for(int i=0;i<s.length();i++){ 5 if(isM(s.substring(i),p)) return true; 6 } 7 return false; 8 }else{ 9 if(p.charAt(0)=='.'||(p.charAt(0)==s.charAt(0))){ 10 return isM(s.substring(1),p.substring(1)); 11 }else{ 12 return false; 13 } 14 } 15 }

二、非递归解法

boolean isMIterate(String s,String p){
    if(s.compareTo("")==0) return p.compareTo("")==0;
    int i=0,j=0;
    int start=-1;
    int ss=0;
    while(i<s.length()&&j<p.length()){
        if(i==s.length()) return j==p.length();
        if(p.charAt(j)=='*'){
            start=j;
            ss=i+1;
            i++;
        }else if(p.charAt(j)=='.'||p.charAt(j)==s.charAt(i)){
            i++;
            j++;
        }else if(start!=-1){
            i=ss;
            j=start+1;
        }else{
            return false;
        }
    }
   if(i<s.length) return false;//如果模式串为空,但是匹配串还有剩余,应该返回false
   if(j<p.length()){//如果模式串有剩余,那么剩余的部分应该趋势*
    for(;j<p.length();j++){
      if(p.charAt(j)!='*') return false;
    }
   }
   return true; }

 

转载于:https://www.cnblogs.com/deepblueme/p/4728779.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值