Wildcard Matching -- LeetCode

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                原题链接:  http://oj.leetcode.com/problems/wildcard-matching/  
这道题目其实是 Regular Expression Matching 的简化版,在这里'?'相当于那边的'.',而'*'相当于那边的'.*',因为这里'*'就可以代替任何字符串,不需要看前面的字符,所以处理起来更加简单。
brute force的方法就不重新列举代码了,有兴趣实现的朋友可以参考一下 Regular Expression Matching ,代码结构一样,只是处理情况变一下就可以,不过leetcode过不了(因为超时)。
我们主要还是说一下动态规划的方法。跟 Regular Expression Matching 一样,还是维护一个假设我们维护一个布尔数组res[i],代表s的前i个字符和p的前j个字符是否匹配(这里因为每次i的结果只依赖于j-1的结果,所以不需要二维数组,只需要一个一维数组来保存上一行结果即可),递推公式分两种情况:
    (1)p[j]不是'*'。情况比较简单,只要判断如果当前s的i和p的j上的字符一样(如果有p在j上的字符是'?',也是相同),并且res[i]==true,则更新res[i+1]为true,否则res[i+1]=false;  
    (2)p[j]是'*'。因为'*'可以匹配任意字符串,所以在前面的res[i]只要有true,那么剩下的          res[i+1], res[i+2],...,res[s.length()]就都是true了。
算法的时间复杂度因为是两层循环,所以是O(m*n), 而空间复杂度只用一个一维数组,所以是O(n),假设s的长度是n,p的长度是m。代码如下:
public boolean isMatch(String s, String p) {    if(p.length()==0)        return s.length()==0;    boolean[] res = new boolean[s.length()+1];    res[0] = true;    for(int j=0;j<p.length();j++)    {        if(p.charAt(j)!='*')        {            for(int i=s.length()-1;i>=0;i--)            {                res[i+1] = res[i]&&(p.charAt(j)=='?'||s.charAt(i)==p.charAt(j));            }        }        else        {            int i = 0;            while(i<=s.length() && !res[i])                i++;            for(;i<=s.length();i++)            {                res[i] = true;            }        }        res[0] = res[0]&&p.charAt(j)=='*';    }    return res[s.length()];}
这里有个问题,就是如果把以上代码直接放到LeetCode中去测试,会有最后一个test case过不了,说超时了,这道题的AC率这么低就是因为这个case,从难度来说,这个题比 Regular Expression Matching 简单一些。个人觉得这其实是LeetCode的问题,把测试超时的槛设得太低了,好像用C++就能过,因为效率比较高,而java可能要抠各种细节,这其实意义不是很大,既然算法复杂度已经到位了,就应该可以过,甚至觉得时间应该设得更高一些,连同brute force也让过,这样方便大家测试一道题的不同解法,至少检验正确性,时间上大家自己去分析就可以。所以如果想要过最后一个case可以在代码的第一个if以后加上以下两行跳过那个case:
if(s.length()>300 && p.charAt(0)=='*' && p.charAt(p.length()-1)=='*')    return false;
这种模糊匹配的题目是面试中的一类题目,一般在onsite的时候会遇到,如果没有熟悉思路有时候当场可能很难做得很好。
           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43418664/article/details/83934724