部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

LeetCode--10. Regular Expression Matching

 

采用递归的方法。

如果p长为0
  若s长为0,返回true,
  否则返回false
如果p长为1,或者第二个字符不是'*'
  如果s长<1,说明一定不能和字母匹配,返回false
  如果s的第一个字母不能和p的第一个字母匹配,返回false
  若上两条都通过了,那么继续递归比较后面的字符串
如果p长度大于1,且第二个字符是'*'
  比较第一个字符加上'*'共同代表0个元素的情况,有符合的,返回true
  比较第一个字符加上'*'共同代表1个或多个元素的情况,有符合的,返回true
  上面均不符合,则返回false  

 

如果第二个字符不是'*'

 

public static void main(String[] args) {

    System.out.println(isMatch("aaassdff","a*s*df.f"));
    System.out.println(isMatch("aa","a"));
    System.out.println(isMatch("ab",".*c"));
    System.out.println(isMatch("aaa","a*a"));
    System.out.println(isMatch("","b."));
    System.out.println(isMatch("aaa", "ab*a*c*a"));
    System.out.println(isMatch("aaa", "aaaa"));
    System.out.println(isMatch("", ".*"));
    System.out.println(isMatch("aa", ".*"));
    System.out.println(isMatch("a", "ab*"));        
}

public static boolean isMatch(String s, String p) {
    if(p.length() == 0)
        return s.length() == 0;
 
    //p的长度是1的情况,或者p从0开始,第1位不是'*'的情况。
    if(p.length() == 1 || p.charAt(1) != '*'){
        if(s.length() < 1 || (p.charAt(0) != '.' && s.charAt(0) != p.charAt(0)))
                return false;
        return isMatch(s.substring(1), p.substring(1));    
 
    }else { //p的长度大于1的情况
        //case 2.1: 一个字符加上'*'共同代表0个元素的情况 
        if (isMatch(s, p.substring(2))) {
            return true;
        }
 
        //case 2.2: 一个字符加上'*'共同代表1个或多个元素的情况  
        //对每一个子串进行尝试
        int i = 0;
        while (i<s.length() && (s.charAt(i)==p.charAt(0) || p.charAt(0)=='.')){
            if (isMatch(s.substring(i + 1), p.substring(2))) {
                return true;
            }
            i++;
        }
        return false;
    }
}

 

posted @ 2015-07-15 10:21  流了个火  阅读(103)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats