#java #time-complexity
#java #временная сложность
Вопрос:
Итак, я должен разделить входную строку на 3 палиндромные подстроки. Это решение, которое было дано, и хотя я хорошо его понимаю, мне трудно определить его временную сложность. Вот код:
public static boolean isPallindrome(String str){
StringBuffer sb = new StringBuffer(str);
return str.equals(sb.reverse().toString());
}
public static void func(String s){
for(int i = 1; i < s.length() - 2; i ){
if (isPallindrome(s.substring(0, i))){
for(int j = i 1; j < s.length(); j ){
if (isPallindrome(s.substring(i, j)) amp; isPallindrome(s.substring(j))){
System.out.print(s.substring(0, i).trim() "n" s.substring(i, j).trim() "n" s.substring(j, s.length()).trim());
return;
}
}
}
}
Какова временная сложность func
функции?
Я думаю, что это будет O (n ^ 2), но я не уверен.
Для такого новичка, как я, было бы действительно полезно, если бы временная сложность этой функции была должным образом объяснена. Спасибо.
Комментарии:
1.Как вы думаете, почему это O (n ^ 2)? В худшем случае входная строка
n
в разы превышает одну и ту же букву, например,func("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
hasn = 40
, и каждый вызовisPallindrome()
в коде вернет значение true. Итак, если вы думаете, что код состоит только из O (n ^ 2), вы не учитываете временную сложностьisPallindrome()
вызова, которая, безусловно, не O (1).2. О, теперь я это понимаю. Означает ли это, что временная сложность будет равна O (n ^ 3)?
3. Больше похоже на O (n ^ 4) , не так ли?
4. О, я вижу, поскольку существует несколько вызовов
isPallindrome()
в 2 разных циклах. Есть ли какой-либо способ уменьшить временную сложность? Мне трудно оптимизировать.