LeetCode—10.Regular Expression Matching

思路:注意一点,*表示前一个字符重复任意次(可以为0次),所以反向匹配,先判断最后一个是不是*,如果是*,再判断前面不是.,然后递归判断。

public class Solution {
    public boolean isMatch(String s, String p) {
        if (p.length()==0) {
			return s.length()==0;
		}
        if (s.length()==0) {
			if (p.length()%2!=0) {
				return false;
			}
			char[] c=p.toCharArray();
			for (int i = 1; i < c.length; i+=2) {
				if (c[i]!='*') {
					return false;
				}
			}
			return true;
		}
        int pl=p.length();
        int sl=s.length();
        String ep=p.substring(pl-1,pl);
        if (ep.equals("*")) {
			if (p.substring(pl-2,pl-1).equals(".")) {
				for (int i = sl-1; i >=0-1; i--) {
					if (isMatch(s.substring(0, i+1),p.substring(0, pl-2))) {
						return true;
					}
				}
				return false;
			}else {
				String k=p.substring(pl-2,pl-1);
				for (int i = sl-1; i >=0; i--) {
					String t=s.substring(i,i+1);
					if (t.equals(k)) {
						if (isMatch(s.substring(0, i+1),p.substring(0, pl-2))) {
							return true;
						}
					}else {
						return isMatch(s.substring(0, i+1),p.substring(0, pl-2));
					}
				}
				return isMatch("",p.substring(0, pl-2));
			}
		}else if(ep.equals(".")){
			return isMatch(s.substring(0, sl-1),p.substring(0, pl-1));
		}else {
			String es=s.substring(sl-1,sl);
			if (ep.equals(es)) {
				return isMatch(s.substring(0, sl-1),p.substring(0, pl-1));
			}
			return false;
		}
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值