Main19-正则表达式匹配

正则表达式匹配

/**
 *  "." : 任意一个字符
 *  "*" : 它前面的字符可以出现任意次数(含0次)
 *  思路:
 *      逐一比对s和p两个字符串
 *          无"*":当s和p的首字符相同,则s和p各自减少一个字符
 *          有"*":
 *                  s和p首字符不相同,则p减少两个字符,s不变
 *                             s: ab  p :b*ab =>  p:ab ,s:ab
 *                  s和p首字符同,则s减少一个字符,p不变
 *                             s:ab p:b*b => s:b  p:b*b
 */
public class Main19 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String p = sc.next();
        System.out.println(isMatch(s, p));
    }

    private static boolean isMatch(String s, String p) {
        if (s.isEmpty() && !p.isEmpty() || !s.isEmpty() && p.isEmpty())
            return false;
        if (s.isEmpty())
            return p.isEmpty();
        //首字母相同的两种情况
        boolean first = s.charAt(0) == p.charAt(0) ||
                ".".equals(String.valueOf(p.charAt(0)));
        //1.p的index=1为"*"
        //首字母不相同,则p删index=0,1 || 首字母同,s删index=0
        if (p.length() >= 2 && "*".equals(String.valueOf(p.charAt(1)))){
            return (!first && isMatch(s,p.substring(2)) || (first && isMatch(s.substring(1),p)));//&&短路作用,前者必须满足,才会执行后者
        }else {
            //2.p不含*,首字母相同时,s,p各删除index=0
            return first && isMatch(s.substring(1),p.substring(1));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/tmax52HZ/article/details/107027528