10. Regular Expression Matching

一、题目

  1、审题:

    

  2、分析:

    两个字符串,其中 '.' 可以代表任意一个字符; ‘*‘ 代表0或多个前一个字符的长度扩充, 判断 两字符串是否可以匹配;

 

二、解答

  1、分析: 

    a、当 p 长度为 0 时,只需判断 s 长度是否为0

    b、当 s 长度为 0 时,看 p 的第二个字符是否为 * :

      Y: 递归判断 s 与 p.substr(2) 是否匹配

      N:返回 false;

    c、当 p 长度大于 1 ,并且 p 第二个字符为 *:

      c1: 若 s 与 p.substr(2) 匹配,则返回 true;否则 c2;

      c2: 若 s 第一个字符与 p第一个相同,或 p第一个字符为 . ,则 s 依次 减少一个字符进行匹配判断;

      c3: 返回 false;

    d、递归判断 s 与 p 每一个字符是否相同;

class Solution {
    public boolean isMatch(String s, String p) {
        //  .  单个任意字符;  // * 0 或多个前一个字符;
        if(p.length() == 0)     // p 为 空
            return s.length() == 0;
        else if(s.length() == 0) {  // s 为 空

            if(p.length() > 1 && p.charAt(1) == '*')  // s为空 p 非空时,只有 p第二个字符为 * 才能匹配;
                return isMatch(s, p.substring(2));
            else
                return false;
        }
        else if( p.length() > 1 && p.charAt(1) == '*') {

            if(isMatch(s, p.substring(2)))
                return true;
            else if(s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')
                return isMatch(s.substring(1), p);  // s 中递减 重复字符
            else
                return false;
        }
        else {
            return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.')
                    && isMatch(s.substring(1), p.substring(1));
        }

    }
}

 

      

 

posted @ 2018-08-01 20:01  skillking2  阅读(114)  评论(0编辑  收藏  举报