【发布时间】:2016-12-13 00:50:27
【问题描述】:
我正在研究如何在 BST 中找到最接近目标的 k 值,并遇到了以下带有规则的实现:
'?'匹配任何单个字符。
'*' 匹配任意字符序列(包括空序列)。
匹配应该覆盖整个输入字符串(不是部分)。
函数原型应该是: bool isMatch(const char *s, const char *p)
一些例子:
isMatch("aa","a") → 假
isMatch("aa","aa") → 真
isMatch("aaa","aa") → 假
isMatch("aa", "*") → 真
isMatch("aa", "a*") → 真
isMatch("ab", "?*") → 真
isMatch("aab", "cab") → 假
代码:
import java.util.*;
public class WildcardMatching {
boolean isMatch(String s, String p) {
int i=0, j=0;
int ii=-1, jj=-1;
while(i<s.length()) {
if(j<p.length() && p.charAt(j)=='*') {
ii=i;
jj=j;
j++;
} else if(j<p.length() &&
(s.charAt(i) == p.charAt(j) ||
p.charAt(j) == '?')) {
i++;
j++;
} else {
if(jj==-1) return false;
j=jj;
i=ii+1;
}
}
while(j<p.length() && p.charAt(j)=='*') j++;
return j==p.length();
}
public static void main(String args[]) {
String s = "aab";
String p = "a*";
WildcardMatching wcm = new WildcardMatching();
System.out.println(wcm.isMatch(s, p));
}
}
我的问题是,有两个额外的索引ii 和jj 的原因是什么,为什么它们会使用-1 进行初始化?每个的目的是什么?用i 和j 遍历它还不够吗?
ii=i; 和 jj=j; 在第一个 if 情况下,i=ii+1; 和 j=jj; 在第三个 if 情况下的目的是什么?
最后,在什么情况下你会遇到while(j<p.length() && p.charAt(j)=='*') j++;?
示例对理解非常有帮助。 提前感谢您,我们将接受回答/赞成票。
【问题讨论】:
-
你想重新发明正则表达式的轮子吗?还是 Java 提供的预先构建的 RegExp 可以为你做?
-
@Arvind 对于算法实践,我正在实施。
-
如果你真的想要一个更直接的方法来做这件事,你可以研究一下 Apache Lucene