【问题标题】:Finding the longest palindrome in a string using recursion使用递归查找字符串中最长的回文
【发布时间】:2018-10-05 03:42:06
【问题描述】:

我不知道为什么我的解决方案只适用于某些字符串。例如,“sdfbananabasdf”将返回“bananab”,但“dtattarrattatddetartrateedre”将在无限循环中运行。提前谢谢!

public String longestPalindrome(String s) {
    if(isPalindrome(s)) {
        return s;
    }
    String divisionOne = longestPalindrome(s.substring(0,s.length()-1));
    String divisionTwo = longestPalindrome(s.substring(1,s.length()));
    return (divisionOne.length() >= divisionTwo.length()) ? divisionOne : divisionTwo;        
}

private boolean isPalindrome(String s) {
    if(s.length() == 1) {
        return true;
    }
    int count = s.length() / 2;

    if(s.length() % 2 == 1) {
        count++;
    }
    for(int i = 0; i < count; i++) {
        if(s.charAt(i) != s.charAt(s.length() - 1 - i)) {
            return false;
        }
    }
    return true;
}

【问题讨论】:

  • 你怎么知道是无限循环?你的算法的时间复杂度是多少?
  • 我知道您的问题指定了递归,但您可能对在线性时间内找到最长回文子串的非递归算法感兴趣:Manacher's algorithm
  • 首先找到一个尽可能小的输入,因为你的算法会失败。其次,使用调试器或任何类型的调试输出逐步比较您的算法所做的与您期望的结果。

标签: java string algorithm palindrome


【解决方案1】:

基本上,你的算法的时间复杂度是O(2^n)

假设f(n)是计算长度为n的字符串的回文的函数,在最坏的情况下,我们可以看到

f(n) = 2*f(n - 1)
f(n - 1) = 2*f(n - 2)
...
f(1) = 1

->f(n)时间复杂度为O(2^n)

因此,对于长字符串,您的程序将需要很长时间才能运行。与示例中一样,包含 29 个字符的字符串将需要 O(2^29) 或 O(5*10^8) 操作。

注意:实际上,每个操作都需要额外的两个substring和一个isPalindrome操作,这会使时间复杂度为O(n*2^n),而不仅仅是O(2 ^n)

如何降低时间复杂度?动态规划应该是答案

【讨论】:

  • @GhostCat 以他为例,有29个字符,即2^29 ~ 5*10^8,但让我再看一下:)
  • 谢谢@PhamTrung!我意识到这是一个时间复杂度问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2015-01-02
  • 2021-05-15
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多