leetcode 10.Regular Expression Matching(正则表达式匹配) 解题思路和方法

Regular Expression Matching

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


这题难度为hard,最主要的实现方法是用递归方法,先判断边界条件,然后再判断p字符串中第二个字符时候为*,分情况讨论。

具体代码和注释如下:

public class Solution {
    public boolean isMatch(String s, String p) {
        if (s == null)
            return p == null;
        if (p == null)
            return s == null;
 
        int lenS = s.length();
        int lenP = p.length();

        if (lenP == 0)
            return lenS == 0;
        
        if(lenP == 1){
            if(lenS == 1){
                if(p.equals(".") || p.equals(s)){
                	return true;
                }
            }
            return false;
        }
        //字符后为*
        if(p.charAt(1) == '*'){
        	  int i = 0;
        	  while(s.length() > 0 && isEquals(s.charAt(0), p.charAt(0))){
        		  //如果截取p的两位后还能匹配,则返回true,如果不能,s截取前i位后与p重新匹配
        		  if(isMatch(s, p.substring(2)))
                      return true;
        		  s = s.substring(1);
        	  }
        	  return isMatch(s.substring(i), p.substring(2));
        }
        //字符后不为*
        else{
        	if(lenS > 0 && isEquals(s.charAt(0), p.charAt(0))){
        		return isMatch(s.substring(1), p.substring(1));
        	}
        	else{
        		return false;
        	}
        }
    }
    
    //判断是否相等
    public static boolean isEquals(char x, char y){
        if(x == y || y == '.'){
            return true;
        }
        return false;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值