ワイルドカード実装
4922 ワード
質問説明:?文字を表します.*0~複数の文字を表します.
問題の考え方:(遡及)
コード実装:
出力:true
問題の考え方:(遡及)
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