Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么最长回文子序列需要DP解?_Java_String_Algorithm_Palindrome - Fatal编程技术网

Java 为什么最长回文子序列需要DP解?

Java 为什么最长回文子序列需要DP解?,java,string,algorithm,palindrome,Java,String,Algorithm,Palindrome,对于最长回文子序列问题,最有效的方法是动态规划方法。以下是LeetCode用户tankztc提供的递归DP解决方案: 这里是没有DP的最简单解决方案: class Solution { public int longestPalindromeSubseq(String s) { if(s.length() == 0 || s.length() == 1) { return s.length(); } else {

对于最长回文子序列问题,最有效的方法是动态规划方法。以下是LeetCode用户tankztc提供的递归DP解决方案:

这里是没有DP的最简单解决方案:

class Solution {
    public int longestPalindromeSubseq(String s) {
        if(s.length() == 0 || s.length() == 1) {
            return s.length(); 
        } else {
            if (s.charAt(0) == s.charAt(s.length()-1)) {
                return longestPalindromeSubseq(s.substring(1, s.length()-1))+2;
            } else {
                return Math.max(longestPalindromeSubseq(s.substring(1, s.length())), 
                                longestPalindromeSubseq(s.substring(0, s.length()-1)));
            }
        }
    }
}

我不明白为什么我们需要DP,因为我觉得上面的非DP解决方案不会多次调用同一子字符串上的
longestPalindromeSubseq()
函数。你什么时候会
memo[i][j]!=null
检查DP解决方案返回值
true

在没有记忆的情况下,您将使用相同的参数多次计算此函数,因为递归树中的不同路径可能会导致您指向相同的字符串参数。例如:

abcd -> abc -> bc
abcd -> bcd -> bc
无记忆算法的时间复杂度是指数的

abcd -> abc -> bc
abcd -> bcd -> bc