1. 程式人生 > >44. Wildcard Matching

44. Wildcard Matching

style enc for http urn including class ++ !=

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", "?*") ? true
isMatch("aab", "c*a*b") ? false


遞歸完美解答,然而超時了
public class Solution {
    public boolean isMatch(String s, String p) {
        if (s.length()==0){
            if ( p.length()>0&&p.charAt(0)==‘*‘){
                return isMatch(s,p.substring(1));
            }else {
                return p.length() == 0;
            }
        }
        
if (p.length()==0){ return s.length()==0; } if (p.charAt(0)==‘?‘){ return isMatch(s.substring(1),p.substring(1)); }else if(p.charAt(0)==‘*‘) { return isMatch(s.substring(1),p)||isMatch(s,p.substring(1)); }else { if (p.charAt(0)==s.charAt(0)){
return isMatch(s.substring(1),p.substring(1)); }else { return false; } } } }

所以考慮用回溯。

此博客講解的很詳細,http://blog.csdn.net/u012848330/article/details/52596618

int bp=-1;
       int bs=-1;
       int i=0;
       int j=0;
       while (i<s.length()){
           if (j<p.length()&&p.charAt(j)==‘*‘){
               j++;
               bp=j;
               bs=i;
           }
           else if (j<p.length()&&(p.charAt(j)==‘?‘||p.charAt(j)==s.charAt(i))){
                i++;
                j++;
           }else if(bp!=-1){
               j=bp;
               i=++bs;
           }
           else {
               break;
           }
       }
       while (j<p.length()&&p.charAt(j)==‘*‘){
           j++;
       }
        return i==s.length()&&j==p.length();

44. Wildcard Matching