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") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → trueisMatch("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]; } }