public PriorityQueue<String> findPalindromesSubstring(String string) {
PriorityQueue<String> palindromes = new PriorityQueue<>();
string = string.replace("","#");
for (int i = 0; i < string.length(); i++) { //n iterations
int j = 0;
while (i-j >= 0 && i+j < string.length() && string.charAt(i-j) == string.charAt(i+j)) {
String palindrome = string.substring(i-j, i+j+1);
if (palindrome.charAt(0) != '#') {
palindromes.add(palindrome.replace("#", ""));
}
j++;
}
}
return palindromes;
}
Я использовал PriorityQueue, потому что мне нужны подстроки палиндром, отсортированные по алфавиту. На данный момент я не забочусь о дубликатах, но я не уверен в худшем случае время работы результат, от моего понимания это что-то вродеКаково время работы этого алгоритма «вычислить все подстроки палиндрома»?
n (chars in string because of for loop)
*
n (max possible length of a palindrome because of inner while loop/2)
*
log(max number of palindromes because of PriorityQueue's add operation)
Так время работы есть O(n^2*logn)
? Или я должен заменить одно из n чем-то другим?
Вы правы в logn^2, но почему у нас самое большее N^2 палиндромов? – alessiop86
У нас может быть не более 'n' палиндромов длина' 1', 'n - 1' длина палиндрома' 2', ..., '2' pallindromes length' n - 1', '1' длина палиндрома' n', поэтому у нас есть «n + n - 1 + ... + 2 + 1 = n * (n + 1)/2' palindromes, вы можете легко проверить его, вызвав' findPalindromesSubstring («aaaa») '. 'n * (n + 1)/2 = O (n^2)' –