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

Java 使用递归查找字符串中最长的回文,java,string,algorithm,palindrome,Java,String,Algorithm,Palindrome,我被困在为什么我的解决方案只适用于某些字符串上。例如,“sdfbananabasdf”将返回“bananab”,但“dtattarrattdatertartratedre”将在无限循环中运行。提前谢谢你 public String longestPalindrome(String s) { if(isPalindrome(s)) { return s; } String divisionOne = longestPalindrome(s.substring

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

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;
}
公共字符串最长回文(字符串s){
如果(isPalindrome){
返回s;
}
String divisionine=最长的回文(s.substring(0,s.length()-1));
String division two=最长的回文(s.substring(1,s.length());
返回(divisionOne.length()>=divisionTwo.length())?divisionOne:divisionTwo;
}
专用布尔值isAlindrome(字符串s){
如果(s.长度()==1){
返回true;
}
int count=s.length()/2;
如果(s.length()%2==1){
计数++;
}
for(int i=0;i
基本上,算法的时间复杂度是
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)操作

注意:实际上,每个操作需要两个额外的
子字符串
和一个
isAlindrome
操作,这将使时间复杂度为O(n*2^n),而不仅仅是O(2^n)


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

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

注意:实际上,每个操作需要两个额外的
子字符串
和一个
isAlindrome
操作,这将使时间复杂度为O(n*2^n),而不仅仅是O(2^n)


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

你怎么知道它是无限循环?你的算法的时间复杂度是多少?我知道你的问题指定了递归,但你可能对一种非递归算法感兴趣,这种算法可以在线性时间内找到最长的回文子串:首先找到一个尽可能小的输入,如果你的算法失败的话。第二,使用调试器或任何类型的调试输出,一步一步地比较您的算法执行的操作和您期望它执行的操作。您如何知道它是无限循环?你的算法的时间复杂度是多少?我知道你的问题指定了递归,但你可能对一种非递归算法感兴趣,这种算法可以在线性时间内找到最长的回文子串:首先找到一个尽可能小的输入,如果你的算法失败的话。第二,使用调试器或任何类型的调试输出,一步一步地比较您的算法执行的操作和您期望它执行的操作。@GhostCat对于他的示例,有29个字符,即2^29~5*10^8,但让我再看一看:)谢谢@Phamtrong!我意识到这是一个时间复杂性issue@GhostCat以他为例,共有29个字符,即2^29~5*10^8,但让我再看看:)谢谢@Phamtrong!我意识到这是一个时间复杂的问题