正则表达式匹配

public class Solution {
    public boolean match(char[] str, char[] pattern)//本题注意str不含'.'和'*'
    {
        int l1=str.length;
        int l2=pattern.length;
        return dfs(str,0,l1,pattern,0,l2);//此题利用递归来实现
    }
    boolean dfs(char []str,int k1,int l1,char []pattern,int k2,int l2){//k1是str的起始位置,l1是长度,k2是pattern的起始位置,l2是长度
        if(k1==l1&&k2==l2)return true;//两者同时遍历到头,字符串匹配
        if(k1==l1){//如果str已经遍历完,看pattern剩余部分是不是利用'*'的特性,可以变为空串
            for(int i=k2;i<l2;i++){
                if(pattern[i]!='*'&&(i+1==l2||pattern[i+1]!='*'))
                    return false;
            }
            return true;
        }
        if(k2==l2) return false;//如果pattern遍历完,str没有遍历完,两者不匹配
        if(k2!=l2-1&&pattern[k2+1]=='*'){//当pattern的下一位元素为*
            boolean flag1=false;
            boolean flag2=false;
            boolean flag0=dfs(str,k1,l1,pattern,k2+2,l2);///0 *前面字符出现0次
            if(pattern[k2]=='.'||str[k1]==pattern[k2]){//当前比较元素相同
                flag1=dfs(str,k1+1,l1,pattern,k2+2,l2);//1 *前面字符出现0次
                flag2=dfs(str,k1+1,l1,pattern,k2,l2);///2..3..n *前面字符出现大于等于2次
            }
            return flag0||flag1||flag2;///三种情况只要一种匹配即可
        }
        else{//当pattern的下一位元素不为*,正常比较即可
            if(pattern[k2]!='.'&&str[k1]!=pattern[k2])
                return false;
            return dfs(str,k1+1,l1,pattern,k2+1,l2);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值