Это мое решение для одной из проблем в leetcode. Через мои выводы я сделал вывод, что он имеет общую сложность времени O (N^2). Тем не менее, я хотел бы получить подтверждение об этом только для того, чтобы не продолжать делать те же ошибки, когда речь заходит о суждении сложности времени и пространства алгоритма.Является ли временная сложность этого кода O (N^2)
О, и проблема состоит в следующем:
Учитывая входной строки, обратный строку слово за словом. , например. "Я тебя" == "ты я"
Код выглядит следующим образом: -
public String reverseWords(String s) {
//This solution is in assumption that I am restricted to a one-pass algorithm.
//This can also be done through a two-pass algorithm -- i.e. split the string and etc.
if(null == s)
return "";
//remove leading and trailing spaces
s = s.trim();
int lengthOfString = s.length();
StringBuilder sb = new StringBuilder();
//Keeps track of the number of characters that have passed.
int passedChars = 0;
int i = lengthOfString-1;
for(; i >= 0; i--){
if(s.charAt(i) == ' '){
//Appends the startOfWord and endOfWord according to passedChars.
sb.append(s.substring(i+1, (i+1+passedChars))).append(" ");
//Ignore additional space chars.
while(s.charAt(i-1) == ' '){
i--;
}
passedChars = 0;
}else{
passedChars++;
}
}
//Handle last reversed word that have been left out.
sb.append(s.substring(i+1, (i+1+passedChars)));
//return reversedString;
return sb.toString();
}
Мои рассуждения для этого будучи O (^ 2 N) алгоритм: -
- цикл = о (п)
- StringBuilder.append = O (1) метод
- подстроку = о (п) [от Java 7]
На этом примечании, если у кого-либо есть лучшее решение, чем это, вы можете поделиться им! :)
Я стремился к однопроходному решению и, следовательно, отказался от разделения строки перед циклом.
Цените помощь!
EDIT: Я хотел спросить о временной сложности части кода, содержащей цикл. Я заранее извиняюсь, если этот вопрос вводит в заблуждение/запутывает. Весь фрагмент кода предназначен для разъяснения. :)
Аннотация расчет Трудоемкость полностью зависит от того, что вы считаете, как 1 операцию. – biziclop
И это можно сделать в линейном времени и в линейном пространстве, если вы считаете доступ или копирование одной буквы в качестве основной операции. – biziclop
Нужно ли правильно обрабатывать Юникод? Куда должны идти точки? У вас есть полная спецификация с большим количеством примеров? –