我创建了一个算法来检查匹配的字符串,因为某些字符可能是由' *'或'定义的正则表达式。'我试图分析它的复杂性;但是我无法看到这个递归函数的Big O究竟是什么。
算法需要2个字符串作为输入,如果一个字符串可以与第二个字符串匹配,则返回一个布尔值,反之亦然。
Example:
A = "abc"
B = "ab*"
Output = true
A = "ab."
B = "abc"
Output = true
A = "abcd*"
B = "ab"
Output = false
public static boolean match(String a, String b) {
//Check if a == b , if so, strings match
if (a.equals(b))
return true;
//Check if second char in a in an asterisk, return true if substring of b matches b.
if (hasAsterisk(a) && match(a.substring(2), b))
return true;
//Check if second char of b is an asterisk, return true if substring of b matches a.
if (hasAsterisk(b) && match(a, b.substring(2)))
return true;
//Check if a and b is not empty
if (!a.isEmpty() && !b.isEmpty()) {
//Check if first char of a is asterisk, if so match a substring with b
if (a.charAt(0) == '*')
return match(a.substring(1), b);
//Check if first char of b is asterisk, if so match b substring with a
if (b.charAt(0) == '*')
return match(a, b.substring(1));
//Check if first char of a or b is "DOT(.)", if so match substrings.
return charMatch(a.charAt(0), b.charAt(0))
&& match(a.substring(1), b.substring(1));
}
//If not match, return false
else
return false;
}
private static boolean hasAsterisk(String a) {
return a.length() > 1 && a.charAt(1) == '*';
}
private static boolean charMatch(char a, char b) {
return a == b || a == '.' || b == '.';
}
我的后续问题是,如何更有效地运行?
谢谢!
答案 0 :(得分:1)
如果您追求Big O复杂性,那么它就是O(n),因为每个循环(eqauls()
,match()
等......)都会增加比较次数它会随着字符串中字符数的增加而变化。为简单起见,我假设两个输入字符串的长度大致相同,因此n
是第一个字符串还是第二个字符串的长度并不重要。
如果你想提高你的大O复杂性,坏消息是你不能。如果你考虑一下,你会发现在最坏的情况下(字符串匹配直到最后一个字符),至少比较每个字符一次就不可能进行这些比较。因此O(n)。
通过不多次重复相同的比较,您可以改进的是实际的比较次数。你的代码中有很多这样的东西。