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)
?或者我应该用其他东西替换其中一个?
答案 0 :(得分:1)
运行时复杂度为O(N^3*log(N^2))
。
让我们仔细看看palindromes.add(palindrome.replace("#", ""));
replace
函数需要O(n)
,add
函数进行O(lg N^2)
比较(因为我们有大多数N^2
回文,因此堆的高度为lg N^2
)。字符串的每次比较都需要O(N)
,因此该行的总时间为O((log N^2) * N + N)