使用递归查找字符串中最长的回文

时间:2018-10-05 03:42:06

标签: java string algorithm palindrome

我坚持为什么我的解决方案仅适用于某些字符串。例如,“ sdfbananabasdd”将返回“ 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;
}

1 个答案:

答案 0 :(得分:3)

基本上,算法的时间复杂度为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)

如何减少时间复杂度?动态编程应该是答案