这个“计算所有回文子串”算法的运行时间是多少?

时间:2016-08-31 07:22:06

标签: algorithm priority-queue palindrome

   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)?或者我应该用其他东西替换其中一个?

1 个答案:

答案 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)