我正在编写一个递归方法,检查字符串的每个字母以进行比较。我无法将“*”字符与任何字符匹配,并根据需要充当许多字母。 (把它作为通配符)
我想知道是否有人可以给我一个关于将要使用的算法的提示?
这是我到目前为止所拥有的。
public static boolean match(String x, String y) {
return match_loop(x, y, 0, 1);
}
public static boolean match_loop(String a, String b, int i, int s) {
try {
if (a == b) {
return true;
}
if (i >= a.length() && i >= b.length()) {
return true;
}
if (a.charAt(i) == b.charAt(i)) {
return match_loop(a, b, i + 1, s);
}
//(((...A bunch of if statements for my other recursion requirements
return false;
} catch (java.lang.StringIndexOutOfBoundsException e) {
return false;
}
}
public static void main(String[] args) {
System.out.println(match("test", "t*t")); // should return true
}
我正在考虑做的是为方法添加另一个争论,一个将作为反向信件的int。基本上我在想这个 如果char(i-s)中的a或b(s最初为1.)是*,则用s + 1重新调用递归。 然后是一些不同的ifs语句来修复bug。然而,这种方法似乎很长且重复。我还可以使用其他算法吗?
答案 0 :(得分:2)
请勿使用==
进行String
值比较。使用equals()
方法。
if (a == b)
应为if a.equals(b)
答案 1 :(得分:0)
看看this algorithm。它返回与模式匹配的所有子串,因此您必须检查整个字符串是否最终匹配,但这应该很容易。
它以O(km)时间运行,其中k是通配符的数量,m是输入字符串的长度。
答案 2 :(得分:0)
如果您只使用一个字符(" *")作为通配符,我建议您使用正则表达式。如;
public static boolean match(String x, String y) {
String regex= y.replace("*", "(.*)");
if(x.matches(regex)) {
return true;
}
}
public static void main(String[] args) {
System.out.println(match("test", "t*t")); // should return true
}
我认为以这种方式阅读代码会更容易。
答案 3 :(得分:-1)
本书将告诉您具体操作方法: http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886
这是一个简单的Java实现,可以帮助您实现正确的目标:http://matt.might.net/articles/implementation-of-nfas-and-regular-expressions-in-java/
基本上,工业强度实施是状态机。您解构正则表达式 - 其中包含'*'的字符串 - 并为其创建图形。然后递归搜索图形,例如在广度优先树搜索中。
以下是对不同方法的讨论,这有助于说明方法:http://swtch.com/~rsc/regexp/regexp1.html