ワイルドカード実装

4922 ワード

質問説明:?文字を表します.*0~複数の文字を表します.
問題の考え方:(遡及)
1.     s、p     ,  “*” ,    s、p    ;
2. “*”  s  i(i = 0, 1, 2, 3...)   ,           ;
3.         1        ,  2;
4.  s        ,        。

コード実装:
public class Wildcard {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = "text.xmla";
        String p = "te**t.*la*";
        System.out.println(match(s, p));
    }

    public static boolean match(String s, String p) {
        //i j          
        //      ?,     
        //  p[j]='*',  ,  *   ,    ,   *   0、1、2、n   ,
        //   i     ,j   *   ,  i+1 
        
        char[] sc = s.toCharArray();
        char[] pc = p.toCharArray();
        //    
        int i=0 ,j =0;
        int slen = sc.length;
        int plen = pc.length;
        //   *   
        int last_star_p = 0;
        int last_star_s = 0;
        
        while(i < slen) {
            if(j < plen && (sc[i] == pc[j] || pc[j] == '?')) {
                //
                i++;
                j++;
            }else if(j < plen && pc[j] == '*') {
                //   *,  ,     last_star_p,    0-n   
                while(j < plen && pc[j] == '*') {
                    last_star_p = j;
                    j++;
                }
                last_star_s = i;
            }else if(last_star_p < plen) {
                //       , j     *   last_star_p,    i+1   
                j = last_star_p + 1;
                last_star_s++;
                i = last_star_s;
            } else {
                return false;
            }
        }
        
        //p         * 
        while(j < plen && pc[j] == '*') {
            j++;
        }
        
        return j == plen;
    }
}

出力:true