我开发了以下代码来确定字符串s是否与字符串x和y交织。 s内可以存在x和y的重复,并且字符不必是连续的。例如,如果字符串s =“ 11011001”,字符串x =“ 110”,字符串y =“ 01”,则返回true。
我希望有人能帮助我确定算法的计算复杂性。我已将算法粘贴在(java)下面,但不确定如何找到其计算复杂性。任何帮助将非常感激。谢谢!
public static boolean isInterleaving (String x, String y, String s) {
if (s.length()==0)
return true;
if (s.charAt(0)==x.charAt(0)) {
x = x.substring(1) + x.charAt(0);
if (isInterleaving(x, y, s.substring(1)))
return true;
}
if (s.charAt(0)==y.charAt(0)) {
y = y.substring(1) + y.charAt(0);
if (isInterleaving(x, y, s.substring(1)))
return true;
}
return false;
}
答案 0 :(得分:0)
运行时为O(2^n)
,其中n
是字符串s
的长度。看到这种情况的方式如下:每次输入isInterleaving
方法时,您都会执行几次在O(1)
时间运行的简单检查(假设substring()
方法为{{1 }})。如果这些检查中的任何一项为真,则进行递归,除了将字符串O(1)
的大小缩小1。在对s
的每次调用中,我们将使0、1或2递归调用isInterleaving
。在最坏的情况下,我们将对isInterleaving进行2次递归调用。由于每次调用isInterleaving
都会导致两个额外的调用,因此会导致指数运行时间。因此,isInterleaving
的最坏情况是运行时间。
另一种推断方法是检查运行时,因为我们使用了越来越长的String:
情况0(s.length()== 0):运行时显然是恒定的,将其称为C。
情况1(s.length()== 1):可能导致两个递归调用,每个递归调用都具有如情况0所述的运行时。因此,运行时为2 * C。
情况2(s.length()== 2):可能导致两个递归调用,每个递归调用都与情况1相同,因此运行时间为2 * 2 * c = 2 ^ 2 * C >
归纳地,我们看到当s.length()== n时,我们的运行时间为2 ^ n * C。由于C是一个常数,因此在考虑“ Big-O”时可以忽略它,因此运行时为O(2^n)
。