String、动态规划——wildcard-matching 通配符匹配

来源:互联网 发布:pubmed数据库手机版 编辑:程序博客网 时间:2024/05/29 04:50

Implement wildcard pattern matching with support for'?'and'*'.

'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "*") → trueisMatch("aa", "a*") → trueisMatch("ab", "?*") → true

isMatch("aab", "c*a*b") → false

递归代码运行超时,但在eclipse上自己测试了几个用例能通过:

public class Solution {    public boolean isMatch(String s, String p) {        if(s == null||p == null)            return false;                 return matchCore(s,0,p,0);    }    public boolean matchCore(String s,int sindex,String p,int pindex)        {        //边界条件        if(sindex == s.length()&&pindex == p.length())//都到达末尾时返回true            return true;                else if(pindex == p.length())//p到达末尾而s没有,则返回false;            return false;                        else if(sindex ==s.length())//s到达末尾,p余下的全部为‘*’返回true,否则返回false;            {            if(p.charAt(pindex) == '*')                {                return matchCore(s,sindex,p,pindex+1);            }else                {                return false;            }        }                //一般条件        if(s.charAt(sindex) == p.charAt(pindex)||p.charAt(pindex) == '?')         {            return matchCore(s,sindex+1,p,pindex+1);        }        else if(p.charAt(pindex) == '*')//当前字符为'*'时的情况;            {            return matchCore(s,sindex+1,p,pindex+1)||                   matchCore(s,sindex,p,pindex+1)||                   matchCore(s,sindex+1,p,pindex);        }        else            {            return false;        }    }}

动态规划:

用空间换时间。运行时间130ms,占用内存5000K。

public class Solution {    public boolean isMatch(String s, String p) {        if(s == null|| p == null)            return false;                int m=s.length()+1;        int n=p.length()+1;                //flag[i][j]表示s.length() == i,p.length()== j时匹配状况;        boolean [][]flag=new boolean [m][n];                       //边界情况:                //s.length和p.length为0时 返回true;        flag[0][0]=true;        //p.length为0,s.length不为0时返回false;        for(int i=1;i<m;i++)            {            flag[i][0]=false;        }        //s.length为0,p.length不为0,只有当p其余全为'*'时,返回true,否则返回false;        for(int j=1;j<n;j++)            {            if(p.charAt(j-1) == '*')                {                flag[0][j]=flag[0][j-1];            }else                {                flag[0][j]=false;            }        }                //一般情况:                for(int i=1;i<m;i++)            {            for(int j=1;j<n;j++)                {                if(s.charAt(i-1) == p.charAt(j-1)||p.charAt(j-1) == '?')                    {                    flag[i][j]=flag[i-1][j-1];                }                else if(p.charAt(j-1) == '*')                    {                    flag[i][j]=flag[i-1][j]||flag[i-1][j-1]||flag[i][j-1];                }                else                    {                    flag[i][j]=false;                }            }        }                return flag[m-1][n-1];    }}


1 0
原创粉丝点击